隐藏并显示ttk.Combobox下拉列表

时间:2017-01-15 21:34:27

标签: python tkinter combobox python-3.5 ttk

情况:当我使用鼠标按钮点击ttk.Combobox的“向下箭头”时,它的标准行为是显示下拉列表。当第二次单击向下箭头时,组合框下拉列表将被隐藏。

使用键盘。可以通过按“向下箭头”一次显示组合框下拉列表。再按下“向下箭头”将向下滚动下拉列表到结尾。反复按“向上箭头”将向下滚动下拉列表,直到突出显示/选择到达下拉列表的顶部,但它最终不会隐藏下拉列表。

问题:不使用鼠标或键盘,即使用计算机编程,如何隐藏ttk.Combobox的公开下拉列表。我知道 w.event_generate("<Down>") 命令可用于编程ttk.Combobox以显示它的下拉列表。但是我如何实现相反的目标呢?也就是说,如何使用相同的 w.event_generate()命令来隐藏下拉列表?或者我应该使用其他什么tkinter命令来实现我想要的目标?

1 个答案:

答案 0 :(得分:1)

我在这个问题上做了几次尝试,终于找到了一种通过编程隐藏组合框下拉列表的方法。我的代码如下所示。

<强>意见:

  1. 使用"combobox_widget_object.event_generate('<Button-1>')"即可 导致组合框下拉列表显示。事件'<Button-1>'似乎是 本质上定义为导致此行为。
  2. 此命令背靠背运行2不会导致显示 并隐藏组合框下拉列表。它仍然只显示下拉列表 列表与单个命令一样。
  3. "combobox_widget_object.after(delay_ms, callback=None, *args)" 方法可用于指示组合框运行功能 经过一段时间的延误。该功能应包含
    "combobox_widget_object.event_generate('<Button-1>')"方法导致 隐藏下拉列表。
  4. <强> CODE:

    # tkinter modules
    import tkinter as tk
    import tkinter.ttk as ttk
    
    """
    Aim:
    Create a combobox widget and use w.event_generate(sequence, sequence,**kw) to
    simulate external stimuli to cause combobox dropdown list to show and hide.
    
    Author: Sun Bear
    Date: 16/01/2017
    """
    
    # Function to activate combobox's '<Button-1>' event
    def _source_delayed_clicked():
        print ('\n def __source_delayed_clicked():')
        print('Delayed 2nd simulation of external stimuli')
        print('HIDE combobox Dropdown list. \n'
              'IT WORKED!')
        source.event_generate('<Button-1>')
    
    root = tk.Tk()
    source_var=tk.StringVar()
    reference=['Peter', 'Scotty', 'Walter', 'Scott', 'Mary', 'Sarah']
    
    # Create Main Frame in root
    frame0 = ttk.Frame(root, borderwidth=10, relief=tk.RAISED)
    frame0.grid(row=0, column=0, sticky='nsew') 
    
    # Create Combobox
    source = ttk.Combobox(frame0, textvariable=source_var, values=reference)
    source.grid(row=0, column=0, sticky='nsew')
    
    # Simulate external stimuli using w.event_generate(sequence,**kw)
    print('\n', '1st simulation of external stimuli using: \n'
          '   source.event_generate('"<Button-1>"') \n'
          ' SHOW Combobox Dropdown List.')
    source.event_generate('<Button-1>')
    #source.event_generate('<Button-1>') # running another similar command
                                        # back to back didn't work
    delay = 1000*6 # 6 seconds delay
    source.after(delay, _source_delayed_clicked)
    

    <强>更新 或者,要隐藏组合框下拉列表,请执行命令 可以使用source.event_generate('<Escape>')代替函数source.event_generate('<Button-1>')中定义的def _source_delayed_clicked()命令。这模拟了按下键盘"Esc"键。