2016-11-08 26 views
1

クラス外からFirstPageクラスで定義されたTextウィジェットにアクセスしようとしています。 FirstPageの新しいインスタンスを作成してこの問題を解決しようとしましたが、使用する正しい引数が見つかりませんでした。また、GUIのインスタンスを使用してアクセスを取得しようとしましたが、失敗しました。Python Tkinter、クラス外のテキストを変更する

私の問題は、クラスの外側からtext.insert(0.0、t)を使用すると解決されます。 GUIに直接関係しない関数によって、Tkinterで表示されるテキストを変更するのに役立ちます。

私が使用しようとしていますコードの起源が発見された:Switch between two frames in tkinter

はまた、私はこの質問のために必要ではありませんでした行を削除。..

import Tkinter as tk 

class GUI(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     tk.Tk.geometry(self, '580x410') 
     container = tk.Frame(self) 

     container.pack(side="top", fill="both", expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     frame = FirstPage(container, self) 
     self.frames[FirstPage] = frame 
     frame.grid(row=0, column=0, sticky="nsew") 

     frame = self.frames[FirstPage] 
     frame.tkraise() 


class FirstPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 

     text = tk.Text(self , height=25, width=80) 
     text.grid(column=0, row=0, sticky="nw") 



app = GUI() 
app.mainloop() 

はEDIT:ここでは があります作業コード:

import Tkinter as tk 

class GUI(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     tk.Tk.geometry(self, '580x410') 
     container = tk.Frame(self) 

     container.pack(side="top", fill="both", expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     frame = FirstPage(container, self) 
     self.frames[FirstPage] = frame 
     frame.grid(row=0, column=0, sticky="nsew") 

     frame = self.frames[FirstPage] 
     frame.tkraise() 

     page_name = FirstPage.__name__ 
     self.frames[page_name] = frame 


    def get_page(self, page_name): 
     return self.frames[page_name] 


class FirstPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 

     self.text = tk.Text(self , height=25, width=80) 
     self.text.grid(column=0, row=0, sticky="nw") 



app = GUI() 
app.get_page("FirstPage").text.insert("1.0", "Hello, world") 
app.mainloop() 

答えて

0

何もする必要はありません。任意のPythonオブジェクトと同様に、オブジェクトを操作するにはオブジェクトへの参照が必要です。

開始コードの概念は、ページが作成される場所であるため、すべてのページへのアクセスを制御する「コントローラ」を持つことです。コントローラーにページへの参照を与える関数を追加し、それを使ってそのページ上の関数を呼び出すことができます。ここで

では、コントローラに必要な変更です:

class GUI(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     ... 
     page_name = FirstPage.__name__ 
     self.frames[page_name] = frame 
     ... 

    def get_page(self, page_name): 
     return self.frames[page_name] 

また、あなたは後でそれにアクセスできるように、ウィジェットへの参照を保持するためにFirstPageを変更する必要があります。

class FirstPage(tk.Frame): 
    def __init__(self, parent, controller): 
     ... 
     self.text = tk.Text(...) 
     ... 

他のコードの中からget_page経由でテキストウィジェットにアクセスできるようになりました(ただし、このページが動作するにはページにコントローラへの参照を保存する必要があります)。

class AnotherPage(tk.Frame): 

    def __init__(self, parent, controller): 
     ... 
     self.controller = controller 
     ... 

    def some_function(self): 
     ... 
     first_page = self.controller.get_page("FirstPage") 
     text = first_page.text.get("1.0", "end-1c") 
     ... 
     first_page.text.insert("end", "some new text\n") 

この手法は、任意のGUIページの外部で機能することに注意してください。あなたのコードではappがコントローラなので、次のようなことができます:

app = GUI() 
app.get_page("FirstPage").text.insert("1.0", "Hello, world") 
+0

回答ありがとうBryan!私は別の質問をしてみようとしていました(別のページを使ってテキストを変更するのではなく、GUIに関連しない他の機能からテキストを変更したい)。たとえば、.txtファイルを読み込んでFirstPageに内容を表示します。より具体的に私の質問を編集しますが、最初はこのコードのOOP理論を理解しようとしますが、それはまだそれと非常に混同されているからです。 – additive

+0

@additive:この回答はまだ適用されます。コードの他の部分から 'app.get_page(" FirstPage ")。text.insert(...)'を実行することができます。 –

+0

はい!ありがとう、本当に役に立ちました!それは今働く。 また、get_page(self、page_name) - selfが見つからず、defのsome_functionがself.textである必要があると言っているだけです。 – additive

関連する問題