2017-04-13 8 views
-2

私はPythonの初心者です。私は別のクラスで変数を使用すると問題があります。助けてください。 ここ異なるクラスの変数を使用する

import Tkinter as tk 

class Page(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
    def show(self): 
     self.lift() 

class Page1(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     label = tk.Label(self, text="This is page 1") 
     label.pack(side="top", fill="both", expand=True) 

     entry = tk.Entry(self) 
     entry.pack() 

class Page2(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     label = tk.Label(self, text="This is page 2") 
     label.pack(side="top", fill="both", expand=True) 

     text = tk.Text(self, entry.get()) 
     root.after(...) 

class MainView(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     p1 = Page1(self) 
     p2 = Page2(self) 


     buttonframe = tk.Frame(self) 
     container = tk.Frame(self) 
     buttonframe.pack(side="top", fill="x", expand=False) 
     container.pack(side="top", fill="both", expand=True) 

     p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1) 
     p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1) 


     b1 = tk.Button(buttonframe, text="Page 1", command=p1.lift) 
     b2 = tk.Button(buttonframe, text="Page 2", command=p2.lift) 


     b1.pack(side="left") 
     b2.pack(side="left") 


     p1.show() 

if __name__ == "__main__": 
    root = tk.Tk() 
    main = MainView(root) 
    main.pack(side="top", fill="both", expand=True) 
    root.wm_geometry("400x400") 
    root.mainloop() 

Using buttons in Tkinter to navigate to different pages of the application?からのサンプルコードは、次に、それは二つの問題があります:

NameError: global name 'entry' is not defined 
NameError: global name 'root' is not defined 

がどのように私はこれらの変数を使用できますか?助けてください!あなたは、あなたを見ることができるように

class Page1(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     self.label = tk.Label(self, text="This is page 1") 
     self.label.pack(side="top", fill="both", expand=True) 

     self.entry = tk.Entry(self) 
     self.entry.pack() 

+0

インポートが正しく機能していないかのようです。 Tkinterが正しくインストールされていることを確認してください。 –

+0

なぜ私は多くのクラスが必要なのですか?変数エントリの場合は、Page1クラスの変数を宣言し、Page2クラスで使用します。変数がクラスにバインドされているので、このようなことは起こりません。本当にそうしたいのであれば、クラス変数としてエントリを宣言して、Page1.entryを使ってアクセスすることができます。 – DineshKumar

+0

スコープの概念と、属性を取得する方法との違いを理解する必要があります。 – direprobs

答えて

-1

あなたは方法の本体内の変数entryを定義している、これはグローバルスコープへentryにアクセスできるようにしない、これはあなたがオブジェクトを埋め込む必要がある方法ですクラスPage1()を呼び出すときにの暗黙のインスタンスselflabelentryオブジェクトを埋め込みます。メソッドまたは関数の本体の内部に割り当てられた変数は、そのメソッドまたは関数に対してローカルになります。それで、あなたのコードをどうやって行かなければなりません。

この概念をよく理解してください:Short Description of Python Scoping Rules

編集:クラスPage2

をあなたが本当にクラスPage1self.entry.getにアクセスしたい場合は、コンストラクタに、クラスのPage1のオブジェクトを渡す必要があります次のようにPage2.__init__に渡されたオブジェクトからエントリを取得します。

class Page2(Page): 
    def __init__(self, page1_obj, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     self.label = tk.Label(self, text="This is page 2") 
     self.label.pack(side="top", fill="both", expand=True) 

     self.text = tk.Text(self, page1_obj.entry.get()) # access attributes of the passed-in object (page1._object) 
     root.after(...) 

コンストラクタにオブジェクトを渡す必要があります。次に、バインドされたメソッドを含むオブジェクトの属性にアクセスできるようになります。あなたがPage1クラスでselftk.Entryに渡したので、self.entry = tk.Entry(self)の返信結果をPage1に使用したかったと思ったからです。 self.entry = tk.Entry(self)の返された結果をPage1クラスに使用するつもりがない場合は、同じ割り当てをPage2self.entry = tk.Entry(self)のコンストラクタに追加できます。

+0

です。しかし、私はclass2でself.entry.get()をどのように使うことができますか? – Ethan

+0

@エタン私はあなたの質問のために私の答えを編集しました。タイトル**編集**の編集部分を参照してください。私はあなたの質問を理解して欲しいと思います。 – direprobs

+0

あなたの回答に感謝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! THXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX – Ethan

関連する問題