使用箭头键滚动的 Tkinter 列表框
Tkinter listbox that scrolls with arrow keys
我正在尝试让我的列表框突出显示第一个对象(这发生在 self.e1.select_set(0)
中。我现在正在尝试滚动列表框,在按下向下箭头时突出显示下一个项目,或者select 通过点击向上箭头向上移动下一个项目。我认为我可以通过绑定来做到这一点,但运气不好。有什么想法吗?
def body(self, master):
self.e1 = tk.Listbox(master, selectmode=tk.SINGLE, height = 3, exportselection=0)
self.e1.insert(tk.END, "1")
self.e1.insert(tk.END, "2")
self.e1.grid(row=0, column=1)
self.e1.select_set(0)
self.e1.bind("<Down>", self.OnEntryDown)
self.e1.bind("<Up>", self.OnEntryUp)
def OnEntryDown(self, event):
self.e1.yview_scroll(1, "units")
def OnEntryUp(self, event):
self.e1.yview_scroll(-1, "units")
谢谢!
顾名思义,yview_scroll
只改变视图,不改变 select离子。
像你select第一个对象用select_set(0)
,你也可以用select_set
来select其他对象。保留对 selected 对象的引用,并在按下按钮时将其用于 select 下一个或上一个对象。只需确保 selection 不会低于 0 或超过列表框的大小。
代码示例:
def body(self, master):
self.e1 = tk.Listbox(master, selectmode=tk.SINGLE, height = 3, exportselection=0)
self.e1.insert(tk.END, "1")
self.e1.insert(tk.END, "2")
self.e1.grid(row=0, column=1)
self.selection = 0
self.e1.select_set(self.selection)
self.e1.bind("<Down>", self.OnEntryDown)
self.e1.bind("<Up>", self.OnEntryUp)
def OnEntryDown(self, event):
if self.selection < self.e1.size()-1:
self.e1.select_clear(self.selection)
self.selection += 1
self.e1.select_set(self.selection)
def OnEntryUp(self, event):
if self.selection > 0:
self.e1.select_clear(self.selection)
self.selection -= 1
self.e1.select_set(self.selection)
作为对 fhdrsdg 答案的轻微改进,不需要单独跟踪所选 ID。由于列表框模式设置为单选,因此可以使用 widget.curselection() 的第一个值。
def body(self, master):
self.e1 = tk.Listbox(master, selectmode=tk.SINGLE, height = 3, exportselection=0)
self.e1.insert(tk.END, "1")
self.e1.insert(tk.END, "2")
self.e1.grid(row=0, column=1)
self.e1.select_set(0)
self.e1.bind("<Down>", self.OnEntryUpDown)
self.e1.bind("<Up>", self.OnEntryUpDown)
def OnEntryUpDown(self, event):
selection = event.widget.curselection()[0]
if event.keysym == 'Up':
selection += -1
if event.keysym == 'Down':
selection += 1
if 0 <= selection < event.widget.size():
event.widget.selection_clear(0, tk.END)
event.widget.select_set(selection)
我正在尝试让我的列表框突出显示第一个对象(这发生在 self.e1.select_set(0)
中。我现在正在尝试滚动列表框,在按下向下箭头时突出显示下一个项目,或者select 通过点击向上箭头向上移动下一个项目。我认为我可以通过绑定来做到这一点,但运气不好。有什么想法吗?
def body(self, master):
self.e1 = tk.Listbox(master, selectmode=tk.SINGLE, height = 3, exportselection=0)
self.e1.insert(tk.END, "1")
self.e1.insert(tk.END, "2")
self.e1.grid(row=0, column=1)
self.e1.select_set(0)
self.e1.bind("<Down>", self.OnEntryDown)
self.e1.bind("<Up>", self.OnEntryUp)
def OnEntryDown(self, event):
self.e1.yview_scroll(1, "units")
def OnEntryUp(self, event):
self.e1.yview_scroll(-1, "units")
谢谢!
顾名思义,yview_scroll
只改变视图,不改变 select离子。
像你select第一个对象用select_set(0)
,你也可以用select_set
来select其他对象。保留对 selected 对象的引用,并在按下按钮时将其用于 select 下一个或上一个对象。只需确保 selection 不会低于 0 或超过列表框的大小。
代码示例:
def body(self, master):
self.e1 = tk.Listbox(master, selectmode=tk.SINGLE, height = 3, exportselection=0)
self.e1.insert(tk.END, "1")
self.e1.insert(tk.END, "2")
self.e1.grid(row=0, column=1)
self.selection = 0
self.e1.select_set(self.selection)
self.e1.bind("<Down>", self.OnEntryDown)
self.e1.bind("<Up>", self.OnEntryUp)
def OnEntryDown(self, event):
if self.selection < self.e1.size()-1:
self.e1.select_clear(self.selection)
self.selection += 1
self.e1.select_set(self.selection)
def OnEntryUp(self, event):
if self.selection > 0:
self.e1.select_clear(self.selection)
self.selection -= 1
self.e1.select_set(self.selection)
作为对 fhdrsdg 答案的轻微改进,不需要单独跟踪所选 ID。由于列表框模式设置为单选,因此可以使用 widget.curselection() 的第一个值。
def body(self, master):
self.e1 = tk.Listbox(master, selectmode=tk.SINGLE, height = 3, exportselection=0)
self.e1.insert(tk.END, "1")
self.e1.insert(tk.END, "2")
self.e1.grid(row=0, column=1)
self.e1.select_set(0)
self.e1.bind("<Down>", self.OnEntryUpDown)
self.e1.bind("<Up>", self.OnEntryUpDown)
def OnEntryUpDown(self, event):
selection = event.widget.curselection()[0]
if event.keysym == 'Up':
selection += -1
if event.keysym == 'Down':
selection += 1
if 0 <= selection < event.widget.size():
event.widget.selection_clear(0, tk.END)
event.widget.select_set(selection)