2017-04-13 71 views
-2

我是一名Python初學者。我在使用不同類的變量時遇到了問題。請幫忙。 這裏是Using buttons in Tkinter to navigate to different pages of the application?在不同的類中使用變量

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() 

示例代碼然後它有兩個問題:

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

如何使用這些變量?請幫忙!

+0

似乎導入無法正常工作。確定Tkinter安裝正確嗎? –

+0

爲什麼我需要這麼多課程?在變量條目的情況下,你已經在Page1類中聲明該變量並在Page2類中使用它。當變量綁定到它們的類時,這種情況就不會發生。如果您真的想這樣做,請將條目聲明爲類變量,以便您可以使用Page1.entry訪問相同的條目。 – DineshKumar

+0

您確實需要熟悉範圍的概念以及它們與獲取屬性的區別。 – direprobs

回答

-1

你定義一個方法的體內的變量entry,這不會使entry訪問全球範圍內,這是你應該如何嵌入對象:

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() 

正如你所看到的,你將labelentry對象嵌入self,當您調用類Page1()時,隱含類Page1的實例。在方法或函數的主體內部分配的任何變量都將變爲本地到該方法或函數。這就是你應該如何使用你的代碼。

熟悉這個概念:Short Description of Python Scoping Rules

編輯:

在類Page2如果你真的想訪問Page1類的self.entry.get,那麼你需要的類第1頁的對象傳遞給構造函數然後從您傳遞給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,所以我想你可能想用Page1的返回結果self.entry = tk.Entry(self)。如果您不打算使用Page1類的返回結果self.entry = tk.Entry(self),則可以在Page2的構造函數中添加相同的賦值:self.entry = tk.Entry(self)

+0

thx回答。但我怎麼能在class2中使用self.entry.get()? – Ethan

+0

@Ethan我編輯了你的問題的答案。請參閱標題**編輯**下的編輯部分。我希望我能理解你的問題。 – direprobs

+0

感謝您的回答!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! THXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX – Ethan