Python按键组合(ctrl+;键或shift+;键)

Python按键组合(ctrl+;键或shift+;键),python,pygame,combinations,keydown,Python,Pygame,Combinations,Keydown,我有一些发生按键事件的python代码,我基本上想知道是否有可能一次按下两个键,比如ctrl+a或类似的东西。这是可能的,还是我必须找到解决方法?如果这是针对GUI的 from Tkinter import * class Application(Frame): def __init__(self, parent): Frame.__init__(self,parent) self.grid() self.create_widge

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

如果这是针对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()
从Tkinter导入*
课程申请(框架):
定义初始化(自身,父级):
帧。\uuuu初始化(自,父)
self.grid()
self.create_widgets()
def创建_小部件(自):
widg=文本(自身)
widg.grid(行=0,列=0)
self.bind_all(“,self.check)#检查是否按下小写字母a
self.bind_all(“,self.check)#检查是否按了大写字母a
def检查(自我、事件):#确保函数中包含事件
打印(“控制-a按下”)
root=Tk()
app=应用程序(根)
root.mainloop()

对于您应该寻找的Pygame,而不是keydown,因为keydown只发生一次,keydown会一直发生,直到释放键为止

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

# store the result of the get_pressed() in those variables.
if key_ctrl_is_down and key_a_is_down:     
    dowhatever()
用于获取特殊键(如Control或Shift)的状态

get_mods()
给出一个整数,您必须使用位运算符将其与常量进行比较,如
KMOD\u SHIFT

见文件:


编辑:示例

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\u LSHIFT
KMOD\u RSHIFT
仅测试左档或右档


编辑:

顺便说一句:示例如何使用
get\u pressed()

  • 您必须使用
    K_LSHIFT
    K_LSHIFT
    来检查两个档位
  • 如果按住SHIFT+A,它会反复打印“按下:SHIFT+A”


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


编辑:

如何识别A、CTRL+A、SHIFT+A、ALT+A、CTRL+SHIFT+A、CTRL+ALT+A、SHIFT+ALT+A、CTRL+SHIFT+ALT+A、CTRL+SHIFT+A



顺便说一句:在我的计算机上,右Alt有问题,因为它用于本机字符。它不适用于
KMOD\u ALT
KMOD\u RALT

哦,是的,对不起,我应该提到它是为pygame设计的,如果这有什么不同的话…@ZenLogic如果是为pygame设计的,我不知道对不起。这似乎不起作用,你能看到我的代码中有什么错误吗?它应该播放尖锐版本的音符,但仍然像只按了“a”一样播放
current_played_sine={'a#':MakeSineWave(277.18)}elif event.key==pygame.K_a和pygame.key.get_mods()&pygame.KMOD_SHIFT:print current_type,277.18 current_played_sine['a#].play(-1)
可能在
elif event.key==pygame.K_a和pygame.get_.key之前有
-对于
SHIFT+A
,first也是正确的。如果pygame.key.get_mods()…:
inside
elif event.key==pygame.K_a:
我很快就做了一个例子。请看答案中的例子。很好,这正是我所需要的,代码也很好而且干净,谢谢你alt的问题不是问题,我只计划使用SHIFT键(以后可能还有ctrl键)
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()
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()