2016-11-08 69 views
1

我想從類的外部訪問在類FirstPage中定義的文本部件。 我試圖通過創建一個FirstPage的新實例來解決這個問題,但找不到要使用的正確參數。還嘗試使用GUI實例獲取訪問權限,但未成功。Python Tkinter,從類外修改文本

我可以從類的外部使用text.insert(0.0,t)來解決我的問題。它可以幫助我修改與Tkinter顯示的文本不直接與GUI相關的函數。

我試圖使用代碼的來源發現: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() 

編輯: 這裏是工作代碼:

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

謝謝你的答案布賴恩!我想問一個不同的問題(我不想通過使用不同的頁面來修改文本,而是從與GUI無關的其他函數中修改文本。)例如,讀入.txt文件並在FirstPage上顯示內容。我將編輯我的問題更具體,但首先會嘗試找出代碼中的OOP理論,因爲我仍然很困惑。 – additive

+0

@additive:這個答案仍然適用。你可以從代碼的任何其他部分執行'app.get_page(「FirstPage」)。text.insert(...)'。 –

+0

是的!謝謝你,你真的很有幫助!它現在有效。 也只是說,def get_page(self,page_name) - 自我缺少,並在def some_function需要self.text – additive