2014-05-23 2 views
0

다음은 필드가 변경 될 때 자체 업데이트되는 채워진 값 형식을 생성하는 데 사용하는 일부 코드의 예입니다. 나는 며칠 동안 다른 클래스의 메서드 내에서 한 클래스의 변수를 호출하고 실험 해 보았습니다. 내가이 방법으로 시도하는 이유는 약 30 개의 섹션으로 끝날 것이므로 코드를 모듈화하고 읽기 쉽도록 만드는 것입니다. 또한, 일반적으로 개체 이름을 지정할 때 일반적으로 숫자를 사용하지 않습니다.Interclass 변수 참조

from tkinter import * 
from tkinter import ttk 

class Application(ttk.Frame): 
    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     Frame1() 
     Frame2() 
     Frame3() 

class Frame1(ttk.Frame): 
    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     ttk.Label(self, text="Frame1").grid() 
     self.var1 = IntVar() 
     self.SetVar1() 
     ttk.Label(self, textvariable=self.var1).grid() 

    def SetVar1(self): 
     self.var1.set(2) 

class Frame2(ttk.Frame): 
    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     ttk.Label(self, text="Frame2").grid() 
     self.var2 = IntVar() 
     self.SetVar2() 
     ttk.Label(self, textvariable=self.var2).grid() 

    def SetVar2(self): 
     self.var2.set(3) 

class Frame3(ttk.Frame): 
    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     ttk.Label(self, text="Frame3").grid() 
     self.var3 = IntVar() 
     self.SetVar3() 
     ttk.Label(self, textvariable=self.var3).grid() 

    def SetVar3(self): 
     self.var3.set(Frame1.var1.get() + Frame2.var2.get()) 

app = Application() 
app.master.title("Window") 
app.mainloop() 

def SetVar3(self): 
    self.var3.set(Frame1.var1.get() + Frame2.var2.get()) 

에 대한 오류가 발생한 코드의 아래쪽으로

과 나는 과거를 얻을 수 없습니다. 분명히 이런 식으로 var1을 호출 할 수 없습니다. 다음과 같은 오류가 발생합니다.

AttributeError: type object 'Frame1' has no attribute 'var1' 

제대로 실행되면, 코드가 유사합니다

그래서
Frame1 
    2 
Frame2 
    3 
Frame3 
    5 

, 내가 무엇을 놓치고?

(잠시 후 코멘트가 있었지만 이후 사라져서이 주제에 관해 토론하는 데 도움이됩니다. 잠시 후 다시 돌아올 것입니다. 아래의 설명은 마술처럼 다시 나타납니다.

하나의 의견은 Frame3을 호출하기 위해 Frame1과 Frame2의 새 인스턴스를 만드는 것에 대해 언급했지만 이러한 새 인스턴스가 Application에서 이미 초기화 된 인스턴스의 값을 공유하지 않으면 도움이되지 않습니다. 코드에 오류가 있지만 자세히 설명하지 않았습니다.

각 댓글에 응답하는 동안 각 댓글이 사라지고 원본을 편집 할 수있는 경고가 표시되었습니다. 대신 게시하십시오. 의견의 요지를 놓쳤습니까?)

답변

1

Frame1Frame2은 모두 인스턴스가 아니라 클래스입니다. 그래서 코드 줄에서 오류가 발생합니다 (var1var2은 클래스 변수가 아닌 인스턴스 변수입니다).

Frame3에 (해당 인스턴스 var1var2 변수에, 아마도 나)이 작품은 당신이 당신의 Frame1Frame2 인스턴스에 대한 참조를 통과해야합니다 확인하십시오. 그런 다음 매개 변수를 사용 Frame3

class Application(ttk.Frame): 
    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     f1 = Frame1() # save frames to local variables, so we can reference them 
     f2 = Frame2() 
     f3 = Frame3(f1, f2) # pass previous frames as args! 

(난 그냥 __init__에서 직접 SetVar3에게 전달할 여기에,하지만 당신이 원하는 경우에 당신은, 대신 self에 속성으로 저장할 수) :

하기에 Application을 변경해보십시오 :

class Frame3(ttk.Frame): 
    def __init__(self, f1, f2, master=None): # take other frames as parameters 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     ttk.Label(self, text="Frame3").grid() 
     self.var3 = IntVar() 
     self.SetVar3(f1, f2)  # pass frames on 
     ttk.Label(self, textvariable=self.var3).grid() 

    def SetVar3(self, f1, f2): # take frames as parameters here too 
     self.var3.set(f1.var1.get() + f2.var2.get()) # use the references 

물론 실제 코드에서 논리가 다를 수 있습니다. 프레임간에 논리적 인 관계가 무엇인지 생각하고 적절하게 서로 참조를 전달하도록합니다.

+0

감사합니다. 나는 f1, f2, f3을 고려해 보았지만 그런 식으로 Frame3에 전달하지 않았습니다. 나는 그것을 시도 할 것이다. –