Python tkinter GUI的几种写法及比较。有些坑我给你踩了

自学python’编程,做点笔记,分享体会。

一、学编程为什么要搞GUI?

不搞GUI,编程就是花拳绣腿。不从搞项目的角度去考虑编程思路永远都是耍流氓。你是报班学习,你会发现你花了大把银子,学了很多基础知识,甚至是提高班,掌握了很多库,但真正想搞项目的时候仍然一筹莫展。想过没有,你写个爬虫,难道会让用户在控制台下运行?没点交互,你好意思跟用户交付?当然大厂除外,那都是流水线作业,你只需管你那颗螺丝钉。

二、Python搞GUI为什么要选tkinter?

常用的库无非就是tkinter, wxPython, pyQt,很多人都觉得tkinter丑陋,好多大牛都推崇pyQt。个人觉得,pyQt页面布局一时爽,当你修改界面,代码又要重新转换,涉及复杂的数据交互绝对让人崩溃。反而,tkinter 是 Python 的标准 GUI 接口,程序员控制起来随时可以做到心中有数,一样也可以做出外观上乘的界面,比如ttkbootstrap库。

三、几种写法

1.逻辑写法

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

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循环。这种写法的好处就是前后逻辑比较好理解,比较适合初学者掌握库的使用逻辑,不利之处就是不好复用。

2.类的写法

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

from tkinter import *

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

    def createWidget(self):
        Button(self, text='确定').pack()
        Button(self, 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课程里都可能只讲单窗口的案例,

3.完全封装

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

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

这样,无论你有多少窗口,结构都十分清晰,主程序简简单单,顿时神清气爽。

这些问题都是小问题,可能很多根本不会引人注意,但你思考得越深,境界越高。


我自学python,致力于掌握和研究爬虫、机器视觉和人工智能三个方向,欢迎指正交流。