Python GUI和类结构

2 投票
2 回答
4640 浏览
提问于 2025-04-18 02:38

把“根”或者“应用程序”和主循环放在一个类里,使用一个框架,而不是分开来,这样的结构好吗?然后在“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 界面里。

撰写回答