2016-06-28 25 views
4

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

1

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?

+0

Ich verwendete schließlich Pymouse Bibliothek, um einen Knopfklick zu simulieren und jetzt funktioniert es perfekt zusammen mit Ihrer Lösung. – dhruvvyas90

1

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:

Verwandte Themen