2016-07-30 29 views
0

Ich habe ein Untermenü in einem Menü erstellt mit Menubutton und Menu Widgets:Tkinter Menübutton Widget Schlüssel Bindung an Menü-Widget Elemente in einem Fenster öffnen

from tkinter import * 
root = Tk() 

def f(event): 
    submenu.invoke(0) 

mainmenu = Menubutton(root, text="Menu") 
mainmenu.pack() 

submenu = Menu(mainmenu) 
mainmenu.config(menu=submenu) 

submenu.add_command(label="Option 1") 
submenu.add_command(label="Option 2") 

Jetzt möchte ich mein Menü einen Schlüssel hinzufügen Bindung:

Es funktioniert als Charme: Wenn ich eine Taste drücke, öffnet sich das Untermenü. Aber das Problem ist, das Untermenü wird als abgerissenes Toplevel-Fenster geöffnet. Aber ich möchte, dass es im gleichen Fenster mit Menü geöffnet wird. Ich fügte tearoff=0 in submenu hinzu (so wurde es so: submenu = Menu(mainmenu, tearoff=0)). Aber jetzt gibt es nichts zurück. Ich versuche herauszufinden, warum das nicht so ist. Vielleicht mache ich etwas falsch ...
Ich habe nach einer Lösung gesucht, aber keine von ihnen löst das Problem. Alles, was sie sagen, ist nur eine Tastenbindung hinzufügen, die etwas ausdruckt, aber ich möchte eine Tastenbindung, die automatisch auf ein Menüelement klickt, und es öffnet die Elementelemente, aber nicht als ein separates Fenster (vielleicht heißt es contextmenu?) . Ich konnte nirgendwo eine Lösung für dieses spezielle Problem finden.
Also wie kann ich es geschehen lassen? Jede Hilfe wäre willkommen.

+0

Es klingt, als ob Sie fragen, wie Sie ein Menü erstellen, das eigentlich kein Menü ist? Wenn es kein Popup-Fenster ist. Wie erwartest du, dass es erscheint? Was meinst du mit "im selben Fenster mit Menü geöffnet"? –

+0

Ich möchte das Untermenü nicht abreißen. –

+0

Wieder funktioniert es als Charme, wenn ich 'tearoff = 0' nicht verwende, aber wenn ich diese Funktionalität hinzufüge, gibt es nichts zurück. Das ist komisch. –

Antwort

1

Ich denke

def f(event): 
    submenu.post(mainmenu.winfo_rootx(), 
       mainmenu.winfo_rooty() + mainmenu.winfo_height()) 

tut, was Sie wollen, auch mit der tearoff=False Option.

+0

Dieser Weg ist die beste Lösung bisher. Ich musste es in meinen Code aufnehmen. Ich erwarte tatsächlich mehr "natürliche" Art und Weise. –