【问题标题】:Is there a way to know if Tkinter optionmenu dropdown is active ?有没有办法知道 Tkinter optionmenu 下拉菜单是否处于活动状态?
【发布时间】:2016-06-28 16:22:55
【问题描述】:

我正在编写一个 Tkinter 程序,其中有一个带有其他 UI 元素的选项菜单。我有一个要求,如果 optionmenu 下拉菜单在特定时间(比如 1 分钟)保持活动状态,我需要关闭下拉菜单并取消选择。我想知道是否有办法知道选项菜单下拉菜单是否处于活动状态。我查看了 this 特定链接,但找不到任何我需要的特定方法。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    使用命令和单击绑定可以轻松跟踪菜单是关闭还是打开。困难的部分是迫使菜单关闭。物理鼠标单击小部件或按下 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 看起来几乎相同,并且可能更简单。你会考虑吗?

    【讨论】:

    • 我最终使用 Pymouse 库来模拟按钮点击,现在它与您的解决方案完美配合。
    【解决方案2】:

    先定义一个变量,(例如: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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多