Комбинации клавиш 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()