2016-05-07 9 views
0

Ich versuche, ein einfaches Tkinter-Programm in Python zu machen, das "True" ausgibt, während ich die "U" -Taste gedrückt halte und "False", wenn ich loslasse. Leider, wenn ich das Programm starte, druckt es "True", wenn ich "U" drücke und dann 300 Millisekunden später "False" druckt.Python Tkinter auf einem Mac: Warum kann ich nicht erkennen, wenn eine Taste gedrückt gehalten wird?

Ich möchte, dass dies in Tkinter oder einem anderen integrierten Modul bleibt, ich möchte keine externen Module wie Pygame verwenden. Ich bin auf einem Mac, OS X El Capitan, Python 2.7.10. Ich bin offen für die Verwendung einer anderen Programmiersprache, solange es ausgeführt wird, und sendet Keypress-Informationen an diese Python-Datei. Das ist mein Code:

import Tkinter 
root = Tkinter.Tk() 

U = False 
Udone = True 

def Ustart(): 
    global Udone 
    Udone = True 
def Press(event): 
    global U 
    global Udone 
    U = True 
    Udone = False 
    print("True") 
    root.after(300, Ustart) 
def Release(event): 
    global U 
    global Udone 
    if Udone: 
     U = False 
     print("False") 


root.bind("u", Press) 
root.bind("<KeyRelease-u>", Release) 
root.mainloop() 
+0

Der Computer sendet kein Key-Down-Signal kontinuierlich, sondern intermittierend mit einer bestimmten Wiederholrate. Auf den meisten Computern zeigt das Programm also True an, wenn die Wiederholungsrate vorüber ist und dazwischen False. Versuchen Sie eine os.system ('xset r off') Zeile zum Programm hinzuzufügen. Unter Linux gibt Ihr Programm "True" aus, wenn die Taste zum ersten Mal gedrückt wird, und "False", wenn die Taste losgelassen wird. –

Antwort

0

Das funktioniert auch, zumindest auf meinem Linux-System. Beachten Sie, dass die Druckschleife von den Funktionen set_the_variable getrennt ist.

import Tkinter 
import os 

os.system('xset r off') 

class KeyRepeat(): 
    def __init__(self, root): 
     root.bind("u", self.press) 
     root.bind("<KeyRelease-u>", self.release) 
     self.check_key=True 
     Tkinter.Button(root, text="Exit", command=root.quit, bg="orange").grid() 

    def press(self, event=None): 
     self.check_key=True 
     self.print_result() 

    def print_result(self): 
     if self.check_key: 
      print("True") 
      root.after(300, self.print_result) 

    def release(self, event): 
     self.check_key=False 
     print("False") 

root = Tkinter.Tk() 
K=KeyRepeat(root) 
root.mainloop() 

os.system('xset r on') 
+0

Ich denke, das würde funktionieren, aber auf meinem Computer heißt es '-bash: xset: command not found' – crackalamoo

+0

Es kann sein, dass Sie root sein müssen, oder Sie müssen den/complete/Pfad/xset bereitstellen . Ich habe Leute gefunden, die xset auf Macs über eine Websuche verwenden, aber sie verwenden möglicherweise eine andere Version des Betriebssystems. –

+0

Probieren Sie auch subprocess.call ('xset r off', shell = True) Beachten Sie die Anführungszeichen. Subprozess wird wahrscheinlich den gleichen Fehler geben. –

Verwandte Themen