2017-01-15 133 views
-1

情況:當我使用鼠標按鈕單擊ttk.combobox的「向下箭頭」時,標準行爲是顯示下拉列表。第二次單擊向下箭頭時,組合框下拉列表將變爲隱藏。如何在沒有外部刺激的情況下隱藏ttk.combobox下拉列表

使用鍵盤。可以通過按下「向下箭頭」一次來顯示組合框下拉列表。進一步按下「向下箭頭」將向下滾動下拉列表到其結尾。重複按下「向上箭頭」將向上滾動下拉列表,直到突出顯示/選擇到達下拉列表的頂部,但它不會最終隱藏下拉列表。

問題:如果不使用鼠標或鍵盤,即使用計算機編程,我怎樣才能隱藏ttk.combobox的暴露下拉列表。我知道w.event_generate("<Down>")命令可以用來編程一個ttk.combobox來顯示它的下拉列表。但是,我如何才能達到相反的目的?也就是說,如何使用相同的w.event_generate()命令來隱藏下拉列表?或者我應該用什麼其他tkinter命令來實現我想要的?

+0

有人可以解釋爲什麼我得到了2個記過我的問題的選票嗎? –

回答

0

我在這個問題上做了幾次嘗試,終於找到了一種通過編程來隱藏組合框下拉列表的方法。我的代碼如下所示。

意見:

  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>')"方法,以使 隱藏下拉列表。

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>')可以就位在功能def _source_delayed_clicked()定義的source.event_generate('<Button-1>')命令一起使用的命令。這模擬按下鍵盤"Esc"鍵。

相關問題