2011-07-01 6 views
2

나는 Tkinter 모듈을 사용하여 파이썬으로 GUI를 만들려고하는데, 그 중 일부는 사용자에게 2 개의 라디오 박스 옵션을 제공하고 그들이 원하는 것을 선택하는 것을 포함합니다. 그들이 틱하는 상자에 따라 다른 결과를 반환하는 다른 함수를 실행합니다. 결과를 창 클래스 외부에서 사용하려고합니다. 그러나 클래스 내부에서 클래스 외부로 값을 보내는 방법을 알지 못합니다. 나는 그것의 상당히 간단하지만 나는 삶의 나를 위해 일할 수 없다고 확신한다.Tkinter의 라디오 박스에서 값 받기 - Python

내 현재 코드는 다음과 같습니다

class BatchIndiv(): 
def __init__(self, master): 
    self.master=master 
    self.startwindow() 
    self.b=0 

def startwindow(self): 

    self.var1 = IntVar() 
    self.textvar = StringVar() 

    self.Label1=Label(self.master, text="Batch or indivdual import?") 
    self.Label1.grid(row=0, column=0) 

    self.Label2=Label(self.master, textvariable=self.textvar) 
    self.Label2.grid(row=2, column=0) 

    self.rb1 = Radiobutton(self.master, text="Batch", variable=self.var1, 
          value=1, command=self.cb1select) 
    self.rb1.grid(row=1, column=0, sticky=W) 

    self.rb2 = Radiobutton(self.master, text="Individual", variable=self.var1, 
          value=2, command=self.cb1select) 
    self.rb2.grid(row=1, column=1, sticky=W) 

    self.Button1=Button(self.master, text="ok", command=self.ButtonClick) 
    self.Button1.grid(row=1, column=2) 

def ButtonClick(self): 
    if (self.var1.get())==1: 
     b=BatchImport() 
     return b 
     self.master.quit() 
     self.master.destroy() 
    elif (self.var1.get())==2: 
     b=IndivImport() 
     return b 
     self.master.quit() 
     self.master.destroy() 
    else: pass 

def cb1select(self): 
    return self.var1.get() 

#End of class definition. 
#Code: 

root=Tk() 
window=BatchIndiv(root) 
b=BatchIndiv.ButtonClick.b 
root.mainloop() 

.... 

는 블랙 박스로 BatchImport 및 IndivImport 기능을 치료, 그들은 단지 내가 ButtonClick 내부 b를 변수에()를 할당 정수 값을 반환합니다. 그 값을 root.mainloop() 아래에서 할 필요가 있습니다 (즉 .... ....). 그러나 그것을 얻는 방법을 모르겠습니다. Tkinter는 특히 모든 사람이 일을하는 데있어 다른 방법을 가지고 있기 때문에 매우 짜증나게합니다. 온라인 문서가 결코 똑같지는 않습니다. 여러 사람이 작성한 것을 시도하고 더 멋진 오류 메시지를주었습니다.

모든 도움을 주시면 감사하겠습니다.

PS - 버튼을 눌렀을 때 창을 닫고 나머지 코드에 값 b를 보내면 어떻게하면 비단뱀을 완전히 종료 할 수 있습니까? 당신이 볼 수 있듯이 .quit() 및 .destroy()를 사용해 보았지만 아무런 운이 없었습니다.

답변

1

귀하의 변수 bb이 파괴됩니다 (당신이 destroy 또는 quit을 한 후)이 클래스가 삭제되는 순간, 그래서 클래스에 단지 지역이다. 따라서 변수 b을 전역으로 정의하십시오.

b = 0     # this is now in the global namespace 

class BatchIndiv(): 
    def __init__(self, master): 
     self.master=master 
     self.startwindow() 
     #self.b=0  # no need for this, directly store in the global variable 

    def startwindow(self): 

     self.var1 = IntVar() 
     self.textvar = StringVar() 

     self.Label1=Label(self.master, text="Batch or indivdual import?") 
     self.Label1.grid(row=0, column=0) 

     self.Label2=Label(self.master, textvariable=self.textvar) 
     self.Label2.grid(row=2, column=0) 

     self.rb1 = Radiobutton(self.master, text="Batch", variable=self.var1, 
           value=1, command=self.cb1select) 
     self.rb1.grid(row=1, column=0, sticky=W) 

     self.rb2 = Radiobutton(self.master, text="Individual", variable=self.var1, 
           value=2, command=self.cb1select) 
     self.rb2.grid(row=1, column=1, sticky=W) 

     self.Button1=Button(self.master, text="ok", command=self.ButtonClick) 
     self.Button1.grid(row=1, column=2) 

    def ButtonClick(self): 
     global b 
     if (self.var1.get())==1: 
      b=BatchImport() 
      self.master.quit() 
      #self.master.destroy() # either quit or destroy, I think one is sufficient, but confirm to be sure. 
     elif (self.var1.get())==2: 
      b=IndivImport() 
      self.master.quit() 
      #self.master.destroy() # either quit or destroy, I think one is sufficient, but confirm to be sure 
     else: pass 

    def cb1select(self): 
     return self.var1.get() 

#End of class definition. 
#Code: 

root=Tk() 
window=BatchIndiv(root) 
root.mainloop() 

# now do here whatever you want to do with the variable b 
print b 

(전역 변수를 사용하는 것은 좋은 생각이 아니다,하지만 난 당신이 b 수행 할 작업을 알 수 없기 때문에, 난 아무것도 제안 할 수 없습니다입니다.)

+0

그래, 내가 그 일을 끝내 었어. 감사. –

1

일반적으로 말하자면, mainloop으로 전화를 건 후에는 코드가 없어야합니다. GUI 프로그램의 작동 방식이 아닙니다.

사용자가 버튼을 누르면 모든 작업이 버튼 명령에 대해 수행되어야합니다. 그런 다음 프로그램을 종료하려면 루트 창을 닫으십시오 (이로 인해 mainloop 메소드가 종료 됨) 프로그램이 종료됩니다. 메인 루프 이후에 물건을 돌려서는 안됩니다.

...이 때문에 mainloop 이후에 단추에서 코드로 데이터를 전달하는 방법에 대한 의문이 제기됩니다.

따라서 예제에서 수행하는 ...을 수행하는 메서드를 만듭니다. ButtonClick에서 해당 메소드를 호출하십시오. 호출하면 GUI에서 원하는 정보를 전달할 수 있습니다.

ButtonClick 사항은 다음과 같이된다 :

def ButtonClick(self): 
    if self.var1.get()==1: 
     b=BatchImport() 

    elif self.var1.get()==2: 
     b=IndivImport() 

    self.DotDotDot(b) 
    self.master.quit() 
+0

그래, 결국 난 모든 코드를 클래스에 넣으려고 시도하지만, 지금은 단계별로 모든 것을 수행하도록하고 있습니다. 고마워요 :) –