【问题标题】:Tkinter listbox that scrolls with arrow keys使用箭头键滚动的 Tkinter 列表框
【发布时间】:2015-06-11 14:51:12
【问题描述】:

我试图让我的列表框突出显示第一个对象(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")

谢谢!

【问题讨论】:

  • “没有运气”是什么意思?你有错误吗?什么错误?您是否没有收到错误,但您会遇到意外行为?

标签: python tkinter listbox vertical-scrolling


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    顾名思义,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)
    

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 2021-10-19
      • 1970-01-01
      • 2012-02-06
      • 2011-05-16
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      相关资源
      最近更新 更多