Python GUI和类结构
把“根”或者“应用程序”和主循环放在一个类里,使用一个框架,而不是分开来,这样的结构好吗?然后在“if __name__...”的地方调用它?
举个例子:
class App:
def __init__(self):
self.root = Tkinter.Tk()
self.root.title("Color Send to Arduino")
2 个回答
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()
2
把你的应用代码放在一个继承自 Frame
的类里,有一个很好的理由,那就是这样可以让你的代码更容易重用。你可以很方便地把它放到任何 Tkinter 的图形界面里,而不需要太多麻烦。
比如在 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 界面里。