2014-04-14 47 views
1

它是一個好的結構有一個框架的「根」或「應用程序」和主循環,而不是單獨的,然後如果「if __name ..」來調用?Python的GUI和類結構

例如:當您使用class,你可以使用一個創建類對象使用多個時間有方法

class App: 

    def __init__(self): 
     self.root = Tkinter.Tk() 
     self.root.title("Color Send to Arduino") 

回答

1

一個很好的理由把你的應用程序代碼中,從Frame繼承的類是,它使你的代碼的可重用性。您可以將它插入到任何Tkinter GUI根目錄中,而無需太多麻煩。

例如在app.py

import Tkinter as tk 

class App(tk.Frame): 
    def __init__(self,parent): 
     tk.Frame.__init__(parent) 
     self.parent = parent 

    def initialise(self): 
     pass 

和other_app.py

from app import App 
import Tkinter as tk 

if __name__ == "__main__": 
    root = tk.Tk() 
    myapp = App(root) 
    myapp.pack() 
    root.mainloop() 

編輯:下面我的意見走,一個實際的(儘管非常簡單),可重複使用的應用程序將是一個鐘。

import Tkinter as tk 
import getpass 
import time 

class WelcomeClock(tk.Frame): 
    def __init__(self,parent): 
     tk.Frame.__init__(self,parent) 
     self.parent = parent 
     self.timevar = tk.StringVar() 
     self.__set_time() 
     self.initialize() 

    def initialize(self): 
     message = "Welcome %s!\nThe time is currently"%(getpass.getuser().capitalize()) 
     self.welcome = tk.Label(self,text=message) 
     self.welcome.pack(anchor=tk.N) 
     self.clock = tk.Label(self,textvar=self.timevar) 
     self.clock.pack() 

    def __set_time(self): 
     self.timevar.set(time.strftime("%Y-%m-%d %H:%M:%S")) 
     self.after(499,self.__set_time) 

if __name__ == "__main__": 
    root = tk.Tk() 
    clock = WelcomeClock(root) 
    clock.pack() 
    root.mainloop() 

隨着WelcomeClock類從tk.Frame繼承我可以很容易地將其導入並裝入任何其他Tkinter的GUI我使用。

+0

很好的例子!所以它會使代碼更加可重用,以便將類的'root = tk.Tk()'和'root.mainloop()'保留在app.py中?或者我應該包含它,因爲在other_app.py中,你可以寫'myapp = App()'?對不起,我是新的GUI設計和麪向對象... – mECH

+0

個人我會離開他們都出類,並把他們在if語句(如我已經添加到代碼),以便他們只執行在實際上正在運行的文件。考慮這個問題的一個好方法是你可能想要在GUI中有多個「應用程序」,但你只想運行一次'root.mainloop'。通過上述設計,您可以添加或刪除GUI中的應用程序,而且不必大驚小怪。 – ebarr

0

import Tkinter 

class simpleapp_tk(Tkinter.Tk): 
    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 
     pass 

if __name__ == "__main__": 
    app = simpleapp_tk(None) 
    app.title('my application') 
    app.mainloop()