Ich schreibe ein Tkinter-Programm, wo ich ein Optionsmenü mit anderen UI-Elementen habe. Ich habe eine Anforderung, dass, wenn Optionsmenü-Dropdown für eine bestimmte Zeit (etwa 1 Minute) aktiv bleibt, ich das Dropdown-Menü schließen und die Auswahl abbrechen muss. Ich habe mich gefragt, ob es einen Weg gibt zu wissen, ob ein Dropdown-Menü für Optionsmenüs aktiv ist. Ich habe this besonderen Link angeschaut, konnte aber keine spezifische Methode für das finden, was ich brauche.Gibt es eine Möglichkeit zu wissen, ob das Dropdown-Menü Tkinter optionsmenu aktiv ist?
Antwort
Nachverfolgen, ob das Menü geschlossen oder offen ist, ist einfach mit einem Befehl und klicken Sie auf Bindung. Der schwierige Teil zwingt das Menü zum Schließen. Entweder ein physischer Mausklick auf das Widget oder Drücken von Escape wird dies tun. Ereignisse zu generieren reicht jedoch nicht. Die folgenden #commented_out-Bits sind fehlgeschlagene Experimente.
import tkinter as tk
root = tk.Tk()
n = 2
after_id = None
menu_open = False
omvar = tk.StringVar(root)
def timeout():
print('timeout called')
omvar.set('')
#root.event_generate('<Key-Escape>', keysym='Escape', keycode=9)
#om.destroy()
#root.event_generate('<FocusIn>')
#root.focus_get()
#root.event_generate('<Button-1>', x=10, y=20)
root.update()
def open(event):
print('open called')
global after_id, menu_open
after_id = root.after(n*1000, timeout)
menu_open = True
def close(val):
print('closed by', val)
global after_id, menu_open
root.after_cancel(after_id)
after_id = None
menu_open = False
om = tk.OptionMenu(root, omvar, 'a', 'b', 'c', command=close)
om.bind('<Button-1>', open)
om.pack()
root.mainloop()
Ein MenuButton + Menü würde fast gleich aussehen und könnte einfacher sein. Würdest du das berücksichtigen?
zunächst eine Variable definieren, (zum Beispiel: DDO = 0) Dann einen Klick auf Ihrer Dropdownlist auslösen, wenn sie angeklickt, Makel DDO = 1 (wenn DDO == 1 dann DDO = 0) und wenn DDO == 1 ein Timer beginnt für 1 Sekunde zu zählen, danach 1 Sekunde, wenn ddo == 1, dann schließen Sie die Auswahlbox (zum Beispiel durch Fokussieren auf ein anderes Element) und tun Sie, was immer Sie wollen. Ein Beispiel Pseudo-Code ist hier:
Ich verwendete schließlich Pymouse Bibliothek, um einen Knopfklick zu simulieren und jetzt funktioniert es perfekt zusammen mit Ihrer Lösung. – dhruvvyas90