2015-04-19 59 views
2

我正在寫一個Tkinter GUI的應用程序,其中包括我想要鍵盤訪問的長列表框。Tkinter Listbox以藍色突出顯示一個元素,但將黑色邊框放在另一個元素旁邊?

滾動一個項目,在使用箭頭鍵時是乏味的,所以我想,讓用戶在列表中更快速地移動,通過打字了元素的名稱,並且也使向上翻頁page down主頁結束工作。

問題是,當我使用Listboxselect_set()方法時,它看起來並沒有完全相同的事情,點擊一個項目或使用箭頭鍵移動。

當我按下箭頭鍵或單擊選擇一個項目時,它會同時以藍色突出顯示該項目,並在其周圍放置一個黑色邊框。

當我只使用select_set()方法時,它只將藍色突出顯示移動到所需的項目。黑色邊框留在原來的位置。

這會導致問題,因爲如果隨後按下上/下箭頭鍵移動我的選擇,它將選擇具有黑色邊框的項目上方/下方的項目,而不是選中突出顯示的項目藍色。

我的問題是,除了藍色突出顯示之外,如何將黑色邊框移動到正確的項目?

下面是截圖,顯示藍色的亮點,黑色的邊框不同步:

Image showing the problem

下面是一些最起碼的代碼重新產生問題。我刪除了實施結束向上翻頁,並向下翻頁,但你仍然可以通過選擇比第一個用鼠標,然後按其他任何元素看到的問題。

from Tkinter import END, Listbox, Tk 

top = Tk() 

listbox = Listbox(top) 
listbox.grid(row = 0, column = 0) 
for item in ['First', 'Second', 'Third', 'Last']: 
    listbox.insert(END, item) 

def onKey(e): 
    if e.keysym == 'Home': 
     listbox.select_clear(0, END) 
     listbox.select_set(0) 

listbox.bind('<Key>', onKey) 

top.mainloop() 

回答

5

問題是因爲函數Listbox.select_set(index)只需選擇你給的指標,和藍色高亮顯示哪些項目選擇的項目。 您需要使用功能Listbox.activate(index)激活您提供的索引項目,然後黑色邊框顯示激活的項目。

我試過了你的代碼,我在函數listbox.select_set(0)下面添加一行listbox.activate(0)。 添加此行代碼後,當用戶按主頁時,藍色突出顯示和黑色邊框將一起移動到第一個項目。

+0

即將發佈 - 你擊敗了我2分鐘。 :) – TigerhawkT3

+2

選擇和激活(在使用鍵盤導航時正式指向的內容)是完全獨立的,這對於實現一些選擇模式(特別是「擴展」模式)是必需的。通常這留給Tk中的低級控制器代碼;你幾乎不用在你自己的代碼中關心這些細節。 –

+0

太好了,謝謝!實際上,我在文檔中看到了這種方法,但是他們對「激活」元素的描述是加下劃線的,而不是一個被黑盒包圍的元素,所以我沒有想到要嘗試它。他們也懶得描述爲什麼「激活」元素很重要。你碰巧有比這更好的文檔:http://effbot.org/tkinterbook/listbox.htm? – ArtOfWarfare

相關問題