2015-12-11 25 views
0

這裏是一些簡單的,運行的代碼(這是從StackOverflow通過sentdex):如何將GUI類分成單獨的文件/模塊?

import tkinter as tk 

LARGE_FONT = ("Verdana", 12) 

class App(tk.Tk): 
    def __init__(self, *args, **kwargs): 

     tk.Tk.__init__(self, *args, **kwargs) 
     tk.Tk.title(self, "This is App") 

     container = tk.Frame(self) 

     container.pack(side=tk.TOP, fill=tk.BOTH, expand=True) 

     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (StartPage, PageOne): 
      frame = F(container, self) 
      self.frames[F] = frame 
      frame.grid(row=0, column=0, sticky=tk.NSEW) 

     self.show_frame(StartPage) 

    def show_frame(self, cont): 

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

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

     tk.Frame.__init__(self, parent) 

     label = tk.Label(self, text="StartPage", font=LARGE_FONT) 
     label.pack(padx=10, pady=10) 

     button = tk.Button(self, text="Visit Page 1", 
          command=lambda: controller.show_frame(PageOne)) 
     button.pack() 

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

     tk.Frame.__init__(self, parent) 

     label = tk.Label(self, text="Page One!", font=LARGE_FONT) 
     label.pack(padx=10, pady=10) 

     button = tk.Button(self, text="Back to Home", 
          command=lambda: controller.show_frame(StartPage)) 
     button.pack() 

app = App() 
app.mainloop() 

現在我試圖把PageOne(和每增加一頁/ pagelogik)到一個單獨的文件,並將其導入爲模塊,例如import <modulename> as <prefix>

這可以在點擊「Page One!」上的按鈕時起作用。 - 但然後它失敗,因爲StartPage在這個文件中是未知的。

所以我只是不能自己弄清楚如何將StartPage的參考文件傳遞給PageOne。我猜想在PageOne的檔案內的一個循環導入StartPage將是一個愚蠢的混亂。

回答

2

解決方案非常簡單:使show_frame接受頁面的名稱作爲字符串。然後,只有應用程序類需要導入每個頁面。然後它可以根據類名找到類的實例。

+0

現在我剛剛在'cont'周圍添加了一個'eval()',它現在被提供爲String。它確實有用,所以非常感謝!也許'eval()'被認爲是不安全的方式呢? – Chrugel

+1

@Chrugel:是的,'eval()'是一個糟糕的選擇。我更新了[原始答案](http://stackoverflow.com/a/7557028/7432)。 –

相關問題