2014-07-24 260 views

回答

6

使用pygame.key.get_mods()得到特殊键的状态就像控制

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

BTW :您可以使用KMOD_LSHIFTKMOD_RSHIFT仅测试左移或仅右移


编辑:

BTW:例如如何使用get_pressed()

    你必须使用 K_LSHIFT
  • K_LSHIFT同时检查转变。
  • 它打印 “按:SHIFT +一个” 一遍又一遍,如果你继续SHIFT +按下一个

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()get_mods()给予实际的信息只有pygame.event.get()是在使用之前。


编辑:

如何识别一个CTRL + 一个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() 

顺便说一句:在我的电脑上有问题右Alt,因为它用于原生字符。它不适用于KMOD_ALTKMOD_RALT

+0

@ZenLogic我添加工作示例如何使用它。 – furas

+0

这似乎没有工作,你能看到我的代码在这里有什么问题吗?它应该播放该音符的锐利版本,但仍会播放,仿佛只有'a'被按下。 'current_played_sine = { '一#':MakeSineWave(277.18)} 的elif event.key == pygame.K_a和pygame.key.get_mods()&pygame.KMOD_SHIFT: 打印current_type,277.18 current_played_sine ['一# '] .play(-1)' – ZenLogic

+0

也许你有'elif event.key == pygame.K_a:''elif event.key == pygame.K_a和pygame.key.get_mods()'之前' - 第一个也是真的为'SHIFT + A'。你有改变顺序或者让'if if pygame.key.get_mods()...:'在elif event.key == pygame.K_a里面:'我很快就做出了例子。 – furas

1

如果这是用于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

哦,是的,对不起,我应该提到这是pygame,如果这有所作为... – ZenLogic

+0

@ZenLogic如果它的pygame我不知道对不起。 –

1

对于pygame的,你应该寻找get_pressed代替的keydown,曲子的keydown只发生一次,按下按键反应,直到按键被释放。

两个按键只是做一个if-stament。

# store the result of the get_pressed() in those variables. 
if key_ctrl_is_down and key_a_is_down:  
    dowhatever() 
相关问题