2014-07-24 292 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() 
相關問題