是否有一种方法来知道如果Tkinter选项菜单下拉菜单是活跃的



我正在编写一个Tkinter程序,其中我有一个带有其他UI元素的选项菜单。我有一个要求,如果选项菜单下拉保持活跃的特定时间(说1分钟),我需要关闭下拉菜单并取消选择。我想知道是否有一种方法知道如果一个选项菜单下拉菜单是活跃的。

通过命令和单击绑定可以轻松地跟踪菜单是关闭还是打开。困难的部分是迫使菜单关闭。用鼠标点击这个小部件或者按下Escape键就可以了。但是生成事件却不能。下面的# commentted_out位是失败的实验。

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()

一个菜单按钮+菜单看起来几乎相同,可能更容易。你会考虑吗?

首先定义一个变量,(例如:ddo = 0)然后触发下拉列表上的点击,当点击时,切换ddo = 1(如果ddo == 1,那么ddo = 0)当ddo == 1时,计时器开始计数1秒,在这1秒之后,如果ddo == 1,则关闭selectbox(例如通过关注另一个元素)并做任何您想做的事情。下面是一个示例伪代码:

def OnClick(event):
    if(ddo == 0):
        ddo = 1
        startTimerForOneSec(whenFinished=finishTimer())
    else:
        ddo = 0
    def finishTimer():
        if(ddo == 1):
            focusOneSomeOtherElements()
            doSomeThingElse()

最新更新