2014-07-24 24 views
5

मेरे पास कीडाउन घटनाओं के साथ कुछ पायथन कोड है, मैं मूल रूप से सोच रहा हूं कि एक समय में दो कुंजी दबाए जा सकते हैं, जैसे ctrl + a या ऐसा कुछ । क्या यह संभव है, या मुझे एक कामकाज मिलना होगा?पायथन कीडाउन संयोजन (ctrl + key या shift + key)

उत्तर

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_LSHIFT याका उपयोग कर सकते हैंकेवल का परीक्षण करने के लिए बाएं शिफ्ट या केवल सही शिफ्ट का परीक्षण करें।


संपादित करें:

Btw: उदाहरण के दोनों पाली की जाँच करने के get_pressed()

  • आप K_LSHIFT उपयोग करने के लिए है और K_LSHIFT का उपयोग कैसे करें।
  • इसे प्रिंट "दबाया: शिफ्ट + एक" बार-बार करता है, तो आप रखना शिफ्ट + एक दबाया।

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 + एक, शिफ्ट + एक, एएलटी + एक, CTRL + एसएचआई एफटी + एक, CTRL + एएलटी + एक, शिफ्ट + एएलटी + एक,, CTRL + शिफ्ट + एएलटी + एक

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_ALT और KMOD_RALT साथ काम नहीं करता।

+0

@ZenLogic मैं काम करने का उदाहरण जोड़ता हूं इसका उपयोग कैसे करें। – furas

+0

यह काम नहीं कर रहा प्रतीत होता है, क्या आप देख सकते हैं कि मेरे कोड में क्या गलत है? इसे नोट के तेज संस्करण को खेलना चाहिए, लेकिन अभी भी खेलता है जैसे केवल 'ए' दबाया जाता है। '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() '- पहली सच भी है 'शिफ्ट + ए' के लिए। आप परिवर्तन आदेश है या बनाने के 'अगर pygame.key.get_mods() ...:' 'अंदर elif event.key == pygame.K_a:' मैं उदाहरण के लिए जल्द ही बनाया है। – furas

1

यदि यह एक जीयूआई के लिए है।

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 के लिए आप keydown के बजाय get_pressed की तलाश की जानी चाहिए cuz keydown केवल एक बार होता, कुंजी दबाए होता है जब तक कुंजी जारी की है।

दो कुंजी के लिए दबाए गए बस एक if-stament करें।

# store the result of the get_pressed() in those variables. 
if key_ctrl_is_down and key_a_is_down:  
    dowhatever() 
संबंधित मुद्दे