【问题标题】:Replace predefined key binded functions in tkinter Listbox替换 tkinter 列表框中预定义的键绑定函数
【发布时间】:2021-02-02 16:35:00
【问题描述】:

我创建了一个列表框,我希望 LeftRight 箭头键(分别)上下移动列表框,但默认键绑定功能 键的作用是像水平滚动一样左右移动列表。

如何更换左右键的功能?

代码看起来像这样吗:

from tkinter import *                                                
window=Tk()                                                          
list_b=Listbox()                                                     
                                                                     
list_b.insert(END,'line 1')                                          
list_b.insert(END,'line 2')                                          
list_b.insert(END,'this is a really really really long line')        
list_b.insert(END,'line 4')                                          
                                                                     
list_b.grid()

list_b.disable_horizontal_scroll() #some method to disable horizontal scroll                                                           
list_b.bind('<Right>',move_down) # has the same effect as the up arrow key                                    
list_b.bind('<Left>',move_up)    # has the same effect as the down arrow key                                  
list_b.focus()                                                       
                                                                     
                                                                     
window.mainloop()

我已经从How can I disable horizontal scrolling in a Tkinter listbox? (Python 3) 尝试过list_b.bind("&lt;B1-Leave&gt;", lambda event: "break"),但它并没有禁用水平滚动。

注意-

我不是要替换 键,我问这个问题是因为它是一个更大、更复杂的代码和给定 sn 的一部分-p 的代码只是一个例子。

【问题讨论】:

    标签: python tkinter listbox


    【解决方案1】:

    您所要做的就是在函数结束时return 'break'。由于我不知道您的功能,因此我为此目的制作了自己的功能,例如:

    def move_down():
        try:
            idx = list_b.curselection()[0]
            list_b.selection_clear(0,'end')
            list_b.selection_set(idx+1)
            list_b.activate(idx+1)
            return 'break'
        except IndexError:
            idx = 0
            list_b.selection_clear(0,'end')
            list_b.selection_set(idx)
            list_b.activate(idx)
            return 'break'
    
    def move_up():
        try:
            idx = list_b.curselection()[0]
            list_b.selection_clear(0,'end')
            list_b.selection_set(idx-1)
            list_b.activate(idx-1)
            return 'break'
        except IndexError:
            idx = list_b.size()
            list_b.selection_clear(0,'end')
            list_b.selection_set(idx-1)
            list_b.activate(idx-1)
            return 'break'
    # Binding
    list_b.bind('<Right>',lambda event:move_down()) 
    list_b.bind('<Left>',lambda event: move_up())    
    

    【讨论】:

    • 那么为任何替换键绑定添加“中断”是否有效?
    • @WiredDifferently 'break' 防止发生默认行为
    【解决方案2】:

    在绑定到事件的函数中,需要返回字符串“break”,以防止发生默认行为。

    其次,虽然您当然可以在 python 中定义 move_upmove_down 命令来模拟向上和向下键的行为,但您也可以直接调用这些键使用的内部 tk 函数。这就是我将在这里介绍的解决方案:

    def move_down(event):
        event.widget.tk.call("tk::ListboxUpDown", event.widget, 1)
        return "break" 
    
    def move_up(event):
        event.widget.tk.call("tk::ListboxUpDown", event.widget, -1)
        return "break" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多