【发布时间】:2014-07-24 00:08:00
【问题描述】:
我有一些发生 keydown 事件的 python 代码,我基本上想知道是否可以同时按下两个键,例如 ctrl+a 或类似的东西。这可能吗,还是我必须找到解决方法?
【问题讨论】:
标签: python pygame combinations keydown
我有一些发生 keydown 事件的 python 代码,我基本上想知道是否可以同时按下两个键,例如 ctrl+a 或类似的东西。这可能吗,还是我必须找到解决方法?
【问题讨论】:
标签: python pygame combinations keydown
使用 pygame.key.get_mods() 获取特殊键的状态,例如 Control 或 Shift。
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_LSHIFT 或KMOD_RSHIFT 仅测试left shift 或仅right shift。
编辑:
顺便说一句:示例如何使用get_pressed()
K_LSHIFT 和K_LSHIFT 来检查两个班次。.
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() 时才提供实际信息。
编辑:
如何识别A、CTRL+A、SHIFT+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_ALT 和KMOD_RALT。
【讨论】:
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() ...: 我很快就做了示例。
如果这是用于 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,您应该寻找 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()
【讨论】: