重新绑定小部件

时间:2017-01-05 11:17:46

标签: python python-3.x tkinter listbox bind

我希望我的列表框“listbox1”在按下按钮“button1”时更改其绑定。首次单击按钮“禁用”列表框,而不会通过listbox1.bindtags((listbox1, Listbox, ".", "all"))失去对列表框中所选元素的关注。

第二次单击应使用<<ListboxSelect>>绑定重新绑定列表框。

问:如何重新绑定列表框?我尝试做一个简单的listbox1.configurelistbox1.bind,在listbox1.bindtags中反转参数,用谷歌搜索,看到这里,我仍然无法理解。

from tkinter import *
root = Tk()

buttontext = StringVar()
buttontext.set("Disable")
frame_1 = Frame(root, bg="white")
frame_1.pack()

def print_(event):
    print("success")

listbox_1 = Listbox(frame_1, activestyle="none", selectmode=SINGLE, height=6, width=11)
listbox_1.pack()
listbox_1.bind("<<ListboxSelect>>", print_)  
listbox_1.insert(0, "test1")
listbox_1.insert(1, "test2")

def toggle_button():      
    if buttontext.get() == "Disable": 
        listbox_1.bindtags((listbox_1, Listbox, ".", "all"))
        listbox_1["exportselection"] = False
        buttontext.set("Normal")

    elif buttontext.get() == "Normal":
        listbox_1.bind("<<ListboxSelect>>", print_) 
        listbox_1["exportselection"] = True
        buttontext.set("Disable")

button = Button(frame_1, textvariable=buttontext, command=toggle_button)
button.pack()
root.mainloop()

1 个答案:

答案 0 :(得分:0)

问题始于这行代码:

listbox_1.bindtags((listbox_1, Listbox, ".", "all"))

它没有做你认为它正在做的事情。虽然它实际上禁用了窗口小部件,但它是因为您要用无效标记替换有效标记。如果要通过删除或更改默认标记来禁用窗口小部件,更简单的方法是删除默认绑定标记:

listbox_1.bindtags((listbox_1, ".", "all"))

要恢复绑定,您只需恢复绑定标记即可。请注意我如何使用"Listbox"作为字符串,而不是实际的类:

listbox_1.bindtags((listbox_1, "Listbox", ".", "all")

注意:你需要重新添加绑定,你只需要重新建立正确的绑定标记:

def toggle_button():      
    if buttontext.get() == "Disable": 
        listbox_1.bindtags((listbox_1, ".", "all"))
        buttontext.set("Normal")

    elif buttontext.get() == "Normal":
        listbox_1.bindtags((listbox_1, "Listbox", ".", "all"))
        buttontext.set("Disable")