Ich möchte an Ereignisse (eine für Strg + Z und eine für Strg + Y) an eine Python-tkinter Form binden, die sehr komplex ist (die Wurzel hat viele Kind-Frames und diese auch haben, so verbindlich das Ereignis zu jedem von denen wäre sehr ärgerlich und überflüssig). Ich hoffte, dass es eine Methode gibt, den Schlüssel an den Stamm zu binden, so dass selbst dann, wenn ich mich auf die Kind-Widgets konzentriere, die Bindung ausgelöst wird. Was ich bisher versucht habe, ist dies:Python tkinter Key-Bindung an alle nachfolgenden Widgets
def _init_gui(self, root):
""" Initializes all members of the gui"""
tkinter.Frame.__init__(self, root) #Superclass init
self.root = root
width, height = root.winfo_screenwidth(), root.winfo_screenheight()
#Most of the code is left out because it is not neccessary
self.root.bind_all("Control-z", lambda _: self.undo())
self.root.bind_all("Control-y", lambda _: self.redo())
Allerdings scheint dies nicht zu funktionieren. Gibt es dafür eine angemessene Lösung? (Ich habe auch die Bind-Methode mit dem gleichen Mangel an Ergebnis versucht)
'bind' oder' bind_all' sollte das funktionieren. Stellen Sie sicher, dass Sie die spitzen Klammern im Befehl verwenden, und Lambda wird hier nicht benötigt: 'self.root.bind (" ", self.undo)' –
Novel
Danke, dumme mich ... Allerdings Lambda wird seit einem Ereignis benötigt wird übergeben und die Signatur von Undo und Redo übernimmt offensichtlich keine Argumente. – PfannkuchenXD
Also fügen Sie es der Signatur hinzu. Die Standardform wäre 'def undo (self, event = None):' damit sie von bind oder normal aufgerufen werden kann. Wenn Sie die Fähigkeit hinzufügen möchten, um es auch aus dem Trace aufzurufen: 'def undo (self, * args):' – Novel