2014-04-14 3 views
1

"root"또는 "app"와 mainloop을 별도의 프레임 대신 Frame이있는 클래스에 포함하고 "if __name .."호출을하는 것이 좋습니까?Python GUI 및 클래스 구조

예 :

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

편집에

은 아래 내 의견과 함께 이동하려면, 재사용 가능한 응용 프로그램 (매우 간단이기는하지만) 실제는 것 시계. WelcomeClock 클래스는 tk.Frame에서 상속으로

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

난 쉽게 가져올 내가 사용하는 다른 Tkinter의 GUI로 팩을 할 수 있습니다.

+0

위대한 예! 따라서 코드의 재사용을 가능하게하여 app.py에 클래스의'root = tk.Tk()'와'root.mainloop()'를 남겨 두는 것이 더 낫겠습니까? 아니면 other_app.py에서'myapp = App()'를 쓸 수 있기 때문에 포함시켜야합니까? 죄송합니다 나는 GUI 디자인과 OOP에 익숙하지 않다. ... – mECH

+0

개인적으로 나는 클래스에서 벗어나서 if 문 (코드에 추가 한 것과 같음)에 넣어 둘 수 있으므로 실제로 실행중인 파일. 이것에 대해 생각해 볼 수있는 좋은 방법은 GUI에 여러 개의 "응용 프로그램"을 갖고 싶을 수 있지만'root.mainloop'을 한 번만 실행하고 싶다는 것입니다. 위의 디자인을 사용하면 약간의 번거 로움없이 GUI에서 앱을 추가하거나 제거 할 수 있습니다. – ebarr

0

당신이이 클래스의 객체를 생성하여 여러 시간이이 방법을 사용할 수 있습니다 class를 사용하여.

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