Tkinter列表框箭头键滚动

5

我想让我的列表框高亮显示第一个对象(可以使用self.e1.select_set(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.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")

谢谢!


“no luck” 是什么意思?你是否收到了错误信息?是什么错误?你是否没有收到错误信息,但却得到了意外的结果? - Bryan Oakley
2个回答

3

如其名,yview_scroll只改变视图而不改变选择。

就像你使用 select_set(0) 选择第一个对象一样,你也可以使用 select_set 来选择其他对象。保持对所选对象的引用,并在按钮按下时使用它来选择下一个或上一个对象。只需确保选择不会低于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)

0
作为对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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接