2017-01-05 4 views
-1

"button1"버튼을 누르면 Listbox "listbox1"의 바인딩이 변경됩니다. 단추를 처음 클릭하면 목록 상자에서 선택한 요소에 포커스를 두지 않고 목록 상자가 비활성화됩니다 (listbox1.bindtags((listbox1, Listbox, ".", "all")) 통해).위젯을 다시 바인딩

두 번째 클릭은 <<ListboxSelect>> 바인딩 목록 상자를 리 바인드해야합니다.

Q : 목록 상자를 리 바인드하려면 어떻게해야합니까? 나는 간단하게하려고 노력했다 listbox1.bindtags의 인수를 뒤집어 쓰는 listbox1.bind,, 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' 메소드를 호출하십시오. 당신이 그것을 시도하고 그것이 효과가 없다고 주장하기 때문에, 우리는 당신이 실제로 시도한 것을보아야 만합니다. 어떤 척척의 코드가 아닙니다. –

답변

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'로 대체하는 것은 목적을 달성하지 못했기 때문에 코드를 이해하기가 더 어려워졌습니다. –