【发布时间】:2016-06-28 16:22:55
【问题描述】:
我正在编写一个 Tkinter 程序,其中有一个带有其他 UI 元素的选项菜单。我有一个要求,如果 optionmenu 下拉菜单在特定时间(比如 1 分钟)保持活动状态,我需要关闭下拉菜单并取消选择。我想知道是否有办法知道选项菜单下拉菜单是否处于活动状态。我查看了 this 特定链接,但找不到任何我需要的特定方法。
【问题讨论】:
我正在编写一个 Tkinter 程序,其中有一个带有其他 UI 元素的选项菜单。我有一个要求,如果 optionmenu 下拉菜单在特定时间(比如 1 分钟)保持活动状态,我需要关闭下拉菜单并取消选择。我想知道是否有办法知道选项菜单下拉菜单是否处于活动状态。我查看了 this 特定链接,但找不到任何我需要的特定方法。
【问题讨论】:
使用命令和单击绑定可以轻松跟踪菜单是关闭还是打开。困难的部分是迫使菜单关闭。物理鼠标单击小部件或按下 Escape 即可。但是生成事件并没有。下面的 #commented_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()
MenuButton + Menu 看起来几乎相同,并且可能更简单。你会考虑吗?
【讨论】:
先定义一个变量,(例如:ddo = 0) 然后触发单击您的下拉列表,单击时切换 ddo = 1(如果 ddo == 1 则 ddo = 0) 当 ddo == 1 时,计时器开始计数 1 秒,如果 ddo == 1 则在 1 秒之后,然后关闭选择框(例如通过关注另一个元素)并做任何你想做的事情。一个示例伪代码在这里:
def OnClick(event):
if(ddo == 0):
ddo = 1
startTimerForOneSec(whenFinished=finishTimer())
else:
ddo = 0
def finishTimer():
if(ddo == 1):
focusOneSomeOtherElements()
doSomeThingElse()
【讨论】: