【问题标题】:pygame keydown combinations (ctrl + key or shift + key)Python 按键组合(ctrl + 键或 shift + 键)
【发布时间】:2014-07-24 00:08:00
【问题描述】:

我有一些发生 keydown 事件的 python 代码,我基本上想知道是否可以同时按下两个键,例如 ctrl+a 或类似的东西。这可能吗,还是我必须找到解决方法?

【问题讨论】:

    标签: python pygame combinations keydown


    【解决方案1】:

    使用 pygame.key.get_mods() 获取特殊键的状态,例如 ControlShift

    get_mods() 给出一个整数,您必须使用按位运算符将其与KMOD_SHIFT 等常量进行比较

    查看文档:pygame.key


    编辑:示例

    import pygame
    import pygame.locals
    
    pygame.init()
    
    screen = pygame.display.set_mode((300,200))
    
    running = True
    
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    running = False
                elif event.key == pygame.K_a and pygame.key.get_mods() & pygame.KMOD_SHIFT:
                    print "pressed: SHIFT + A"
    
    pygame.quit()
    

    顺便说一句:您可以使用KMOD_LSHIFTKMOD_RSHIFT 仅测试left shift 或仅right shift


    编辑:

    顺便说一句:示例如何使用get_pressed()

    • 您必须使用K_LSHIFTK_LSHIFT 来检查两个班次。
    • 如果您一直按住 SHIFT+A,它会一次又一次地打印“pressed: SHIFT + A” .

    .

    import pygame
    import pygame.locals
    
    pygame.init()
    
    screen = pygame.display.set_mode((300,200))
    
    running = True
    
    while running:
    
        #
        # events
        #
    
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    running = False
    
        #
        # others
        #
    
        all_keys = pygame.key.get_pressed()
    
        #print 'shift:', all_keys[pygame.K_LSHIFT], all_keys[pygame.K_RSHIFT]
    
        if all_keys[pygame.K_a] and (all_keys[pygame.K_LSHIFT] or all_keys[pygame.K_RSHIFT]):
            print "pressed: SHIFT + A"
    
    pygame.quit()
    

    顺便说一句: get_pressed()get_mods() 仅在之前使用过 pygame.event.get() 时才提供实际信息。


    编辑:

    如何识别ACTRL+ASHIFT+A , ALT+A, CTRL+SHIFT+A, CTRL +ALT+A, SHIFT+ALT+A, , CTRL+SHIFT+ALT+A

    import pygame
    import pygame.locals
    
    pygame.init()
    
    screen = pygame.display.set_mode((300,200))
    
    running = True
    
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    running = False
    
                elif event.key == pygame.K_a:
    
                    mods = pygame.key.get_mods()
    
                    if mods & pygame.KMOD_CTRL and mods & pygame.KMOD_SHIFT and mods & pygame.KMOD_ALT:
                        print "pressed: CTRL+SHIFT+ALT + A"
                    elif mods & pygame.KMOD_CTRL and mods & pygame.KMOD_SHIFT:
                        print "pressed: CTRL+SHIFT + A"
                    elif mods & pygame.KMOD_CTRL and mods & pygame.KMOD_ALT:
                        print "pressed: CTRL+ALT + A"
                    elif mods & pygame.KMOD_SHIFT and mods & pygame.KMOD_ALT:
                        print "pressed: SHIFT+ALT + A"
                    elif mods & pygame.KMOD_SHIFT:
                        print "pressed: SHIFT + A"
                    elif mods & pygame.KMOD_CTRL:
                        print "pressed: CTRL + A"
                    elif mods & pygame.KMOD_ALT:
                        print "pressed: ALT + A"
                    else:
                        print "pressed: A"
    
    
    pygame.quit()
    

    顺便说一句:在我的计算机上 Right Alt 有问题,因为它用于本机字符。它不适用于KMOD_ALTKMOD_RALT

    【讨论】:

    • 这似乎不起作用,你能看出我的代码有什么问题吗?它应该播放音符的尖锐版本,但仍然播放好像只按下“a”。 current_played_sine = { 'a#': MakeSineWave(277.18)} elif event.key == pygame.K_a and pygame.key.get_mods() & pygame.KMOD_SHIFT: print current_type, 277.18 current_played_sine['a#'].play(-1)
    • 可能你在elif event.key == pygame.K_a and pygame.key.get_mods() 之前有elif event.key == pygame.K_a : - 第一个也适用于SHIFT+A。您有更改订单或在elif event.key == pygame.K_a : 中创建if pygame.key.get_mods() ...: 我很快就做了示例。
    • 见答案中的例子。
    • 非常好,正是我需要的,代码也很简洁,谢谢
    • alt 的问题不是问题,我只打算使用 SHIFT(可能稍后使用 ctrl)
    【解决方案2】:

    如果这是用于 GUI。

    from Tkinter import *
    
    class Application(Frame):
         def __init__(self, parent):
             Frame.__init__(self,parent)
             self.grid()
             self.create_widgets()
    
        def create_widgets(self):
             widg = Text(self)
             widg.grid(row=0,column=0)
    
             self.bind_all("<Control-a>", self.check) #This checks if lower case a is pressed
             self.bind_all("<Control-A>", self.check) #This checks if upper case a is pressed
    
       def check(self, event): #Make sure to have event inside the function
             print("Control-a pressed")
    
    root = Tk()
    
    app = Application(root)
    
    root.mainloop()
    

    【讨论】:

    • 哦,是的,对不起,我应该提到它是为 pygame 准备的,如果这有影响的话......
    • @ZenLogic 如果它用于 pygame 我不知道对不起。
    【解决方案3】:

    对于 Pygame,您应该寻找 get_pressed 而不是 keydown,因为 keydown 只发生一次,key down 发生直到 key 被释放。

    对于按下的两个键,只需执行一个 if 语句。

    # store the result of the get_pressed() in those variables.
    if key_ctrl_is_down and key_a_is_down:     
        dowhatever()
    

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      相关资源
      最近更新 更多