跳转至

Python GUI 的几种写法

逻辑写法

就是按程序执行的先后顺序从前到后写代码。

from tkinter import *

root = Tk()
root.title('张彬彬')
root.geometry('200x100+100+100')
Button(root, text='确定').pack()
Button(root, text='取消').pack()
root.mainloop()

就三步就可以创建一个 GUI 了,1创建Tk对象,2添加控件,3给个 mainloop 循环。这种写法的好处就是前后逻辑比较好理解,比较适合初学者掌握库的使用逻辑,不利之处就是不好复用。

类的写法

Python里,一切都是对象,因此,可以用类将窗口封装起来,便于扩展、重构等。

from tkinter import *

class Myapp(Frame):
    def __init__(self, master):
        super().__init__()
        self.master = master
        self.pack()
        self.createWidget()

    def createWidget(self):
        Button(root, text='确定').pack()
        Button(root, text='取消').pack()

if __name__ == '__main__':
    root = Tk()
    root.title('张彬彬')
    root.geometry('200x100+100+100')
    app = Myapp(master=root)
    app.mainloop()
这是一种网上常见的写法,其中还是有几个问题。1是主窗口 if 主程序中创建,需要进行必要的主窗口,还需要传递一个 master 参数,表明 Myapp 类的依附对象,比较麻烦,容易犯错。另外,如果程序涉及多个窗口时,这种写法就不好管理了,除了创建新的窗口类之外,还得在 if 主程序中创建新的窗口,略显重复臃肿。需要注意,Myapp 类继承的是 Frame 类,初始化里面必须要自己 pack()一下。很多很牛的 python 课程里都可能只讲单窗口的案例。比如尚学堂里的例子:

采用了面向对象的方式, 通过类 Application 组织整个 GUI 程序, 类 Application 继承了父类的特性, 通过 init() 初始化窗口中的对象, 通过 createWidgets() 方法创建窗口中的对象。
Frame 框架是一个 tkinter 组件, 表示一个矩形区域。 Frame 通常作为容器使用, 可以放置其他组件, 从而实现复杂的布局。

from tkinter import *
from tkinter import messagebox

class Application(Frame):
    """一个经典的GUI程序类写法"""
    def __init__(self, master=None):
        super().__init__(master)          # super代表的是父类的定义,而不是父类的对象
        self.master = master
        self.pack()
        self.createWidget()

    def createWidget(self):
        """创建组件"""
        self.btn01 = Button(self)
        self.btn01['text'] = "点击送花"
        self.btn01.pack()
        self.btn01["command"] = self.songhua
        self.btnQuit = Button(self, text='退出', command=self.destroy)
        self.btnQuit.pack()

    def songhua(self):
        messagebox.showinfo('送花', '送你99朵玫瑰花')

root = Tk()
root.geometry("400x100+200+300")
root.title('测试')
app = Application(master=root)
root.mainloop()

完全封装

将一个窗口所有内容全部封装到一个类中。

from tkinter import *

class Myapp(Tk):
    def __init__(self):
        super().__init__()
        self.title('张彬彬')
        self.geometry('200x100+100+100')
        self.createWidget()

    def createWidget(self):
        Button(self, text='确定').pack()
        Button(self, text='取消').pack()

if __name__ == '__main__':
    app = Myapp()
    app.mainloop()
这样,无论你有多少窗口,结构都十分清晰,主程序简简单单,顿时神清气爽。
这些问题都是小问题,可能很多根本不会引人注意,但你思考得越深,境界越高。