2014-10-13 5 views
0

목록 상자에서 선택한 항목의 변경 또는 선택한 라디오 버튼의 변경 항목에 의해 트리거되는 이벤트를 만들고 싶습니다. 가능한가? 이 코드를 사용합니다 :목록 상자 및 파이썬 Tkinter의 라디오 버튼에 의해 트리거되는 이벤트

def getScript(event): 
    state = rb.get() 
    listScript = [] 
    processor =() 
    processor = lb1.get(lb1.curselection()) 
    if processor : 
     if (state == 1): 
      print processor 
     if (state == 2): 
      pass 
     if (state == 3): 
      pass 


frame2 = Frame(top) 
frame2.pack(fill = X) 
rb = IntVar() 

R1 = Radiobutton(frame2, text = "Parallel Test", 
       variable = rb, value = 1, command = getScript) 
R2 = Radiobutton(frame2, text = "Non Parallel Test", 
       variable = rb, value = 2, command = getScript) 
R3 = Radiobutton(frame2, text = "Specific Test", 
       variable = rb, value = 3, command = getScript) 

R1.grid(row = 0, column = 0, padx = 10) 
R2.grid(row = 0, column = 1, padx = 10) 
R3.grid(row = 0, column = 2, padx = 10) 

frame3 = Frame(top) 
frame3.pack(fill = X) 
space_frame3 = Frame(frame3, width = 10) 
l5 = Label(frame3, text = "Processor Unit") 
l6 = Label(frame3, text = "Script for test") 
lb1 = Listbox(frame3, height = 7, exportselection = 0) 
lb1.bind('<<ListboxSelect>>',getScript) 
scrollbar = Scrollbar(frame3) 
lb2 = Listbox(frame3, height = 7, width = 40, 
       yscrollcommand = scrollbar.set, exportselection = 0) 

목록 상자에서 항목을 선택하기 전에 라디오 버튼을 선택하면 모든 것이 잘됩니다. 하지만 또 다른 라디오 버튼을 선택 때마다, 그것은 반환 : 당신이 라디오 버튼이 선택하면

TypeError: getScript() takes exactly 1 argument (0 given) 

답변

2

는 무엇 일 :

1)으로 intVar rb는 버튼 값

2로 설정 됨) 명령 getScript가 호출됩니다.

전화 그게입니다 (하나 개의 매개 변수를 기대 명령 getScript과 같은 매개 변수를 제공하기 위해 람다 함수를 사용하여 함수 :이 경우 2 가지 옵션이 왜

하지만, 할 어떤 이벤트를 생성하지 않는 라디오 버튼 선택, 그건 에러 메시지).

R1 = Radiobutton(frame2, text = "Parallel Test", 
       variable = rb, value = 1, 
       command = lambda : getScript(None)) 

타 옵션입니다 - 당신의 목표는 선택한 어떤 위젯 알고 있음을 보인다으로 - 이러한 명령을 사용하기 : 위젯을 소요하여 getSript 기능을

R1 = Radiobutton(frame2, text = "Parallel Test", 
       variable = rb, value = 1, 
       command = lambda : getScript(R1)) 

합니다. 좋아요 :

def getSript(widget): 
    print widget["text"] 
+0

첫 번째 해결책은 저에게 잘 돌아갑니다. 두 번째 솔루션을 사용하면 getScript 함수에 'event'인수를 추가 할 필요가 없다는 의미입니까? 함수에 대한 목록 상자의 바인딩을 변경합니까? 함수 인수에 이벤트를 추가 할 필요가없는 경우 이벤트에서 함수를 트리거하는 것이 가능한지 궁금합니다. 미리 감사드립니다. – ferryard

+0

호출 된 함수가 마우스 위치와 같은 이벤트 매개 변수에 의존하지 않으면 이벤트를 제공하지 않고 이벤트에서 함수를 호출 할 수 있습니다. 예를 들어 함수에'None'을 넘겨 주면 이벤트가 없다는 것을 알 수 있습니다 ... 그래서 함수의 인자로 필요없이 이벤트에 함수를 호출하고 있습니다.). 두 번째 제안은 rb에 대한 전역 호출없이 어떤 위젯이 선택되었는지 알 수 있습니다. rb 값을 사용하여 작동하는 인수없이 호출 된 함수를 상상할 수 있습니다. 'event' 매개 변수 만 제거하면됩니다. –