Комбинации клавиш Python (ctrl + key или shift + key)
У меня есть код python с событиями keydown, мне в основном интересно, можно ли одновременно нажимать две клавиши, например ctrl+a или что-то в этом роде. Возможно ли это, или мне придется найти обходной путь?
3 ответов
использовать , с которым Pygame.ключ.get_mods() чтобы получить состояние специальных ключей, таких как управления или Shift.
get_mods()
дает целое число, и вы должны использовать побитовые операторы, чтобы сравнить его с константами, как KMOD_SHIFT
посмотреть документацию: , С которым Pygame.ключ
EDIT: пример
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()
BTW: вы можете использовать KMOD_LSHIFT
или KMOD_RSHIFT
чтобы проверить только слева shift или только сдвиг вправо.
EDIT:
BTW: пример использования get_pressed()
- вы должны использовать
K_LSHIFT
иK_LSHIFT
чтобы проверить обе смены. - это печать " нажата: SHIFT + A" снова и снова, если вы держите 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()
использовался раньше.
EDIT:
как признать 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()
BTW: на моем компьютере проблема с Правый Alt потому что он используется для собственных символов. Это не работает с KMOD_ALT
и KMOD_RALT
.
Если это для 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 происходит только один раз, ключ вниз происходит, пока ключ не будет выпущен.
две клавиши вобще, если-stament.
# store the result of the get_pressed() in those variables.
if key_ctrl_is_down and key_a_is_down:
dowhatever()