2017-01-05 5 views
-1

Я хочу, чтобы мой список «listbox1» менял привязку при нажатии кнопки «button1». Первый щелчок на кнопке «отключает» список, не теряя фокуса на выбранном элементе в списке через listbox1.bindtags((listbox1, Listbox, ".", "all")).re-binding a widget

Второй щелчок должен переустановить список с привязкой <<ListboxSelect>>.

Вопрос: Как переустановить список? Я попытался сделать простой listbox1.configure, listbox1.bind, отменив аргументы в listbox1.bindtags, googled, посмотрел здесь, и я до сих пор не могу понять это.

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() 
+0

Этот код не работает, у него есть замечательное количество ошибок. 'buttntxt' не определен,' do_smth' не определен, в строке 18 есть синтаксическая ошибка, 'buttntxt.get()' не является допустимым оператором, вы не можете предоставить класс в качестве связующего, ... –

+0

его не совсем об окружающей среде, я знаю, что этот код не будет работать, но мой acutal код делает. мой вопрос заключается только в том, как повторно привязать виджет. btw buttntxt и buttontxt - это одна и та же переменная, это ошибка, вызываемая ошибкой – tumper

+0

Чтобы перепрограммировать виджет, вы просто вызываете метод 'bind'. Поскольку вы утверждаете, что вы пробовали это, и это не сработало, нам нужно посмотреть, что вы _actually_ пытались, а не какой-то притворяющийся код. –

ответ

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") 
+0

Ну ладно, теперь я понимаю. Поэтому вместо замены привязки лучше удалить его и позже восстановить его, получил. Это работает отлично, это было большой помощью. Спасибо! – tumper

+0

Вы можете заменить тег связывания, если хотите, но если вы замените его чем-то бесполезным, вы можете просто удалить его. Когда вы меняете тег связывания на что-то, что не имеет смысла, подразумевается, что вы сделали это по какой-то причине. Однако замена тега связывания на «Listbox» не принесла никакой цели, что затрудняет понимание кода. –