2014-07-24 19 views

Odpowiedz

6

Zastosowanie pygame.key.get_mods() aby uzyskać stan klawiszy specjalnych jak Kontroli lub SHIFT.

get_mods() daje jedną liczbę całkowitą i trzeba użyć operatory bitowe, aby porównać go ze stałymi jak KMOD_SHIFT

patrz dokumentacja: pygame.key


EDIT: przykład

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 : możesz użyć KMOD_LSHIFT lub KMOD_RSHIFT do testowania tylko z lewej strony przesunięcie lub tylko prawe przesunięcie.


EDIT:

BTW: przykład jak używać get_pressed()

  • trzeba użyć K_LSHIFTK_LSHIFT i sprawdzić obie zmiany.
  • drukować "wciśnięty: SHIFT + " znowu i znowu, jeśli trzymać SHIFT + A prasowanego.

.

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() 

BTW:get_pressed() i get_mods() podać aktualne informacje tylko jeśli pygame.event.get() było wykorzystanie wcześniej.


EDIT:

Jak rozpoznać A, CTRL + A, SHIFT + , ALT + , CTRL + SHI FT + , CTRL + ALT + , SHIFT + ALT + ,, CTRL + SHIFT + ALT +

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: Na moim komputerze występuje problem z Right Alt, ponieważ jest używany dla znaków rodzimych. Nie działa z KMOD_ALT i KMOD_RALT.

+0

@ZenLogic Dodaję przykład pracy, jak z niego korzystać. – furas

+0

To chyba nie działa, czy widzisz, co jest nie tak w moim kodzie? Powinien odtwarzać ostrą wersję notatki, ale wciąż gra tak, jakby naciśnięty był tylko "a". 'current_played_sine = { 'A #': MakeSineWave (277,18)} elsif event.key == pygame.K_a i pygame.key.get_mods() pygame.KMOD_SHIFT: druku current_type, 277,18 current_played_sine [ 'A # '] .play (-1) ' – ZenLogic

+0

Prawdopodobnie masz' elif event.key == pygame.K_a: 'before' elif event.key == pygame.K_a i pygame.key.get_mods() '- first is true również dla 'SHIFT + A'. Zmieniłeś kolejność lub zrobiłeś 'if pygame.key.get_mods() ...:' inside 'elif event.key == pygame.K_a:' Wkrótce zrobiłem przykład. – furas

1

Jeśli dotyczy to 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() 
+0

O tak, przepraszam, powinienem był wspomnieć, że to było dla pygame, jeśli to robi różnicę ... – ZenLogic

+0

@ZenLogic jeśli to dla pygame Nie mam pojęcia przepraszam. –

1

Dla Pygame należy szukać na get_pressed zamiast keydown, bo keyDown zdarza się tylko raz, w dół, aż stanie klawisz zostanie zwolniony.

dla dwóch naciśniętych klawiszy wystarczy zrobić strzyżenie.

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