2017-02-13 4 views
0

Ich versuche, Schlüssel zu lösen/deaktivieren, sobald es geklickt hat, und seine Funktion nach 2s wieder aufzunehmen. Aber ich kann den Code für die Aufhebung nicht herausfinden. Die Bindung ist im Fenster. Hier ist der Code, den ich bisher versucht habe:Python lösen/deaktivieren Sie die Tastenbindung nach dem Klick und setzen Sie es später wieder

self.choiceA = self.master.bind('a', self.run1) #bind key "a" to run1 
def run1(self, event=None): 
    self.draw_confirmation_button1() 
    self.master.unbind('a', self.choiceA) #try1: use "unbind", doesn't work 

    self.choiceA.configure(state='disabled') #try2: use state='disabled', doesn't't work, I assume it only works for button 
    self.master.after(2000, lambda:self.choiceA.configure(state="normal")) 

Weiter, wie kann ich den Schlüssel nach 2s wieder aktivieren?

Vielen Dank!

Antwort

0

self.master.unbind('a', self.choiceA) funktioniert nicht, da das zweite Argument, das Sie zurückgegeben haben, der Rückruf ist, den Sie lösen möchten, statt der ID, die zurückgegeben wurde, als die Bindung erstellt wurde.

Um die erneute Bindung zu verzögern, können Sie die .after(delay, callback) Methode verwenden müssen, wo delay in ms ist und callback ist eine Funktion, die keine Argumente übernimmt.

import tkinter as tk 

def callback(event): 
    print("Disable binding for 2s") 
    root.unbind("<a>", bind_id) 
    root.after(2000, rebind) # wait for 2000 ms and rebind key a 

def rebind(): 
    global bind_id 
    bind_id = root.bind("<a>", callback) 
    print("Bindind on") 


root = tk.Tk() 
# store the binding id to be able to unbind it 
bind_id = root.bind("<a>", callback) 

root.mainloop() 

Bemerkung: da Sie eine Klasse verwenden, werden meine bind_id globalen Variablen ein Attribut für Sie sein (self.bind_id).

Verwandte Themen