我最近一直在研究一個使用 Text 小部件顯示字串串列的 Tkinter (Python) 專案,但我遇到了一個無法解決的問題:在啟動時,我希望突出顯示第一行,當我點擊向上/向下箭頭時,突出顯示向上/向下,作為選擇欄。我成功地做到了這一點,但問題是高亮僅在按下箭頭時出現,而當它們被釋放時,它就會消失。即使我沒有按任何鍵,我也希望它保持不變。
這是我的代碼:
class Ui:
def __init__(self):
# the list I want to display in Text
self.repos = repos
# here is the entry keys are bind to
self.entry = Entry(root)
self.entry.pack()
self.bind('<Up>', lambda i: self.changeIndex(-1))
self.bind('<Down>', lambda i: self.changeIndex(1))
# here is the Text widget
self.lists = Text(root, state=NORMAL)
self.lists.pack()
# inits Text value
for i in self.repos:
self.lists.insert('insert', i '\n')
self.lists['state'] = DISABLED
# variable I use to navigate with highlight
self.index = 0
self.lists.tag_add('curr', str(self.index) '.0', str(self.index 1) '.0') # added '.0' to make it look '0.0' instead of '0'
self.lists.tag_config('curr', background='#70fffa', background='#000000')
self.root.mainloop()
def changeIndex(self, n):
# error gestion (if < 0 or > len(repos), return)
self.lists.tag_delete('curr')
self.lists.tag_add('curr', str(self.index) '.0', str(self.index 1) '.0')
self.index = self.index n
# to make it scroll if cannot see :
self.lists.see(str(self.index) '.0')
我在 Stack 上沒有看到任何類似的問題,所以我問了,但不要猶豫,告訴我它是否重復。
你們能幫我嗎?謝謝 !
編輯:如果你想嘗試一下,這里是完整的代碼:https : //github.com/EvanKoe/stack_tkinter.git
編輯:我將 main.py 檔案(呼叫 ui.py 的 """backend""" 檔案)添加到演示存盤庫中。這樣,您就可以運行該專案(請注意,main.py 中有“YOUR TOKEN”和“YOUR ORGANIZATION”字串,您必須使用自己的令牌/組織進行修改。我無法推送我的或 Github 會要求我洗掉我的令牌)
uj5u.com熱心網友回復:
以下代碼應該符合您的預期。下面代碼解釋
from tkinter import *
repos = ["one","two","three","four"]
class Ui:
def __init__(self, parent):
# the list I want to display in Text
self.repos = repos
# here is the entry keys are bind to
self.entry = Entry(parent)
self.entry.pack()
self.entry.bind('<Up>', lambda i: self.changeIndex(-1))
self.entry.bind('<Down>', lambda i: self.changeIndex(1))
# here is the Text widget
self.lists = Text(parent, state=NORMAL)
self.lists.pack()
# inits Text value
for i in self.repos:
self.lists.insert('insert', i '\n')
self.lists['state'] = DISABLED
# variable I use to navigate with highlight
self.index = 1
self.lists.tag_add('curr', str(self.index) '.0', str(self.index 1) '.0') # added '.0' to make it look '0.0' instead of '0'
self.lists.tag_config('curr', background='#70fffa', foreground='#000000')
def changeIndex(self, n):
print(f"Moving {n} to {self.index}")
self.index = self.index n
self.index = min(max(self.index,0),len(self.repos))
self.lists.tag_delete('curr')
self.lists.tag_config('curr', background='#70fffa', foreground='#000000')
self.lists.tag_add('curr', str(self.index) '.0', str(self.index 1) '.0')
# to make it scroll if cannot see :
self.lists.see(str(self.index) '.0')
root = Tk()
ui = Ui(root)
root.mainloop()
對您的代碼所做的更改很少
- 將
Ui
函式更改為接受父 tk 物件作為引數 - 更改
self.index
為初始化為 1 而不是 0,因為文本框上的第一行是 1 而不是 0 - 將向上/向下鍵系結到輸入框。不知道為什么這是你想要的,但這似乎是你的評論所表明的
- 添加了一些檢查代碼來限制 1 和 len(repos) 之間的索引值
- 自從您洗掉標簽后,每次設定標簽樣式時都重新創建標簽樣式(這就是它沒有顯示的原因)
我建議您將向上/向下按鈕按下系結到文本框而不是輸入框。必須選擇一個空白輸入框才能在串列中上下滾動似乎有點奇怪。
另外,您為什么不只使用 Tkinter 串列小部件中的構建?
uj5u.com熱心網友回復:
我終于設法解決了這個問題,這是由于我的事件系結。我決定(改進 UX)在頂部 Entry 上系結向上/向下箭頭,而不是在 Text 小部件上系結 em。我系結了 4 個事件:
- 向上箭頭 => 向上移動突出顯示,
- 向下箭頭 => 向下移動突出顯示,
- 回傳鍵 => 呼叫 get_name(),一個回傳所選選項的函式,
- 任何其他 Key => 呼叫 repo_filter(),這是一個根據條目中輸入的內容更新 Text 小部件中顯示選項的函式。
問題是按下向上/向下箭頭會觸發“向上/向下鍵”事件和“任何其他鍵”事件,因此由于重繪 了文本值,突出顯示被洗掉。
為了解決這個問題,我只需要驗證在“任何其他鍵”事件回呼中按下的鍵既不是向上箭頭也不是向下箭頭:
def repo_filter(evt):
if evt.keysym == 'Up' or evt.keysym == 'Down': # verify that pressed key
return # isn't '<Down>' or '<Up>'
# filter Text widget
另外,很抱歉我一開始沒有給你所有的代碼,因為你確實無法猜測那些事件系結。
感謝所有試圖幫助我的人!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/337156.html