2017-03-14 4 views
1

Ich bin auf ein seltsames Problem gestoßen und ich kann nicht herausfinden, was passiert. Ich arbeite an einer Tkinter-Anwendung, die ein Menü verwendet. Ich habe festgestellt, dass einige Elemente beim Erstellen des Menüs, in dem alle Elemente über Accelerators verfügen, zusätzliche Bindungen erfordern, damit die Accelerators funktionieren (sofern die Menüleisten nicht bereits ausgewählt sind) und einige nicht.Tkinter Menü Bindungen und Beschleuniger

Wenn eine zusätzliche Bindung erforderlich ist, habe ich ein Problem mit Doppel-Tastatureingaben. Zum Beispiel, wenn ich ein Toplevel Fenster öffne, bekomme ich doppelte Einträge jedes Mal, wenn ich ein Zeichen in eine Entry Box, sowohl in der Toplevel als auch im Hauptfenster eintippe. Dies geschieht nur, wenn der Menüpunkt über den Tastaturbefehl aufgerufen wird.

Meistens ist das kein Problem, obwohl ich gerne wissen möchte, was die Ursache ist, weil es einfach falsch scheint, aber das ist mir vor kurzem besonders aufgefallen, als ich das integrierte OS X implementiert habe Menü Einstellungen mit dem folgenden Code:

self.window.createcommand('::tk::mac::ShowPreferences', self._settings) 

Nun, wenn ich die Einstellungen Funktion von den build-in-Einstellungen Tastaturbefehl aufrufen Command-,, die eine neue Toplevel Fenster instanziiert, diese doppelte Eintrag ist, was passiert. Es passiert nicht, wenn ich zum Menü navigiere und es mit der Maus öffne.

Das Beispiel unten erstellt das Problem für mich neu. Die Menüleiste ist nicht unbedingt erforderlich, aber das Problem tritt sowohl bei der Menüleiste als auch beim integrierten OS X-Präferenzen-Element auf. Interessanterweise reproduziert 'Einstellungen A', die keine Bindung erfordert, das Problem, aber 'Einstellungen B', die eine Bindung erfordert, funktioniert gut. Und wieder nur mit Tastenbefehlen.

import Tkinter 

def settings(event = None): 
    top = Tkinter.Toplevel() 
    Tkinter.Entry(top).pack() 
    top.mainloop() 

root = Tkinter.Tk() 

root.createcommand('::tk::mac::ShowPreferences', settings) 

menuBar = Tkinter.Menu(root) 
fileMenu = Tkinter.Menu(menuBar) 
fileMenu.add_command(label = 'Settings A', accelerator = 'Command-Shift-a', command = settings) # Does not require binding 
fileMenu.add_command(label = 'Settings B', accelerator = 'Command-b', command = settings)  # Requires binding 
menuBar.add_cascade(label = 'File', menu = fileMenu) 
root.config(menu = menuBar) 
root.bind('<Command-b>', settings) 

Tkinter.Entry(root).pack() 
root.mainloop() 

Ich vermutete, es könnte ein Computerproblem sein, aber ich habe es auf einer anderen Maschine versucht und ich bekomme das gleiche Ergebnis. Hat jemand eine Idee, was hier passiert und wie ich es verhindern kann?

+0

Bitte erstellen [Minimal, Complete, und prüfbare Beispiel] (http://stackoverflow.com/help/mcve), die mit möglichst wenigen Zeilen wie möglich zeigt, wie Sie die Bindungen schaffen und die Code, der die doppelten Einträge verursacht. –

+0

Ich habe die Frage bearbeitet, um ein Codebeispiel hinzuzufügen. –

Antwort

0

Falls jemand interessiert ist, denke ich, dass ich dem auf den Grund gegangen bin. Ich glaube, es wurde durch die Version von tkinter verursacht, die ich hatte. Heute habe ich von der OS X gebündelten Version 2.7 auf Python 3 aktualisiert und das Problem ist geblieben. Dann habe ich tkinter auf ActiveTcl 8.5.18.0 aktualisiert und das Problem scheint verschwunden zu sein.

IDLE and tkinter with Tcl/Tk on macOS

Verwandte Themen