📚 目录 Python tkinter 面向对象教程(零基础 · 循序渐进 · OOP 贯穿版)

Python tkinter 面向对象教程(零基础 · 循序渐进 · OOP 贯穿版)

本书定位:你还没学过 tkinter,连"控件"是什么都可能是第一次听说;但你已经会 Python 基础、也学过面向对象(类、对象、self、方法)。本书就从这个起点出发,一个控件一个控件地认识,循序渐进,最终能用面向对象的方式独立做出完整的桌面小项目。

主线项目:图形界面通讯录管理器。它不会一上来就出现,而是随章节每章只新增一个控件/能力,慢慢长大——你始终能看见"学到了哪"。

全教程红线(统一遵守):
1. 每个窗口/界面都用类封装:class App:,__init__(self, root) 里建控件,方法即事件回调。
2. 所有控件示例一律写在类的方法里,不用脱离类的扁平脚本。
3. 每章代码块尽量可独立运行(带 if __name__ == "__main__":)。
4. 每章开头的"红线回顾"请先扫一眼,整本书的写法都按它来。

星级说明:★ 了解 · ★★ 理解 · ★★★ 掌握 · ★★★★ 重点必会。

怎么学:每章先认识控件"是什么",再"在类里写出来",然后学它的常用选项/方法,最后做练习。别跳着读——下一章一定建立在本章之上。

本教程章节(全 20 章 + 3 附录,已全部发布)


第 1 章 认识 GUI、控件与第一个窗口

本章目标:建立三个最基础的认知——① GUI 是什么;② 控件(widget)是什么;③ 一个 tkinter 程序由哪三步组成。然后你就能写出人生第一个窗口,并立刻用面向对象的方式把它重写一遍(这是本书红线,第 1 章就定调)。


1.1 什么是 GUI(图形用户界面)★

是什么:GUI 是 Graphical User Interface(图形用户界面)的缩写。你平时用的软件——微信、记事本、浏览器——那些能"用鼠标点按钮、在框里打字"的界面,就是 GUI。

对比命令行:之前你写的 Python 程序大多是"命令行程序"——在黑框框里输入、屏幕上一行行吐字。GUI 程序没有黑框,它有一个真正的"窗口",里面有按钮、文字、输入框,你用鼠标键盘和它们交互。

为什么学 GUI:同样一个"通讯录",命令行版要靠你记指令、手打格式;GUI 版谁都会用——这就是界面的价值。学会 tkinter,你写的程序就能"像软件一样"交给别人点着用。


1.2 什么是"控件"(widget)★

是什么:控件(英文叫 widget,也常译作"组件""部件")是界面里每一个可见、可交互的小元素。常见的控件有:

一个关键直觉:界面 = 用控件"搭"出来的。就像用乐高积木拼模型,每个控件是一块积木,你把它们摆进窗口、排好位置,再让它们之间"互动"起来,就是一个完整的程序。本书后面每一章,就是认识一块新"积木"(新控件),并学会怎么把它拼进你的通讯录项目。


1.3 为什么选 tkinter ★

有什么(tkinter 的优势):

为什么不够"好看"(以及对策):tkinter 原生的控件风格偏"复古"。但本书后续会讲 ttk 模块——它提供一套跟随系统的"现代皮肤"控件,一换就好看;还会教你把界面拆成组件类,做出结构清晰的专业软件。所以"丑"不是问题,循序渐进解决。

结论:对零基础、想快速做出能跑的桌面程序的人来说,tkinter 是最顺的那条路。

1.4 一个 tkinter 程序的三要素 ★★

无论多复杂的 tkinter 程序,骨架永远这三步:

  1. 建窗口:tk.Tk() 创建一个主窗口对象。这个窗口是所有控件的"容器"。
  2. 放控件:往窗口里添加按钮、文字等控件,并设置它们的内容、位置。
  3. 进入主循环:窗口.mainloop() 让窗口"活"起来——它开始监听鼠标点击、键盘输入等事件,一直运行直到你关掉窗口。
形象理解:Tk() 是把舞台搭起来;放控件是把演员请上台;mainloop() 是拉开帷幕、大幕拉开后戏才开演(程序才开始响应你操作)。少了 mainloop(),窗口一闪就没——这是新手第一个坑。

1.5 第一个最小例子(两行也能跑)★

先不急着用类,用最短的代码让你看到窗口,建立信心:

# 第1章 例1.1:最小窗口(两行核心代码)
import tkinter as tk          # ① 导入 tkinter 模块,起个别名 tk,后面都用 tk.xxx 调用

root = tk.Tk()                # ② 创建主窗口对象,变量名习惯叫 root("根窗口")
root.mainloop()               # ③ 进入主循环:窗口显示出来,等待你操作;关闭窗口后程序才结束

逐行说明:

运行它,你会看到一个空白的小窗口——恭喜,你的第一个 GUI 程序诞生了。

💡 在哪里运行:tkinter 需要"有桌面的环境"(你的 Windows/Mac 电脑本机)。在服务器、云编辑器、没有显示器的环境里 mainloop() 会卡住或报错——本书所有代码都请在本机 Python 环境运行。

1.6 立即用面向对象重写(本书红线,第 1 章就定调)★★

上面的两行代码能跑,但不符合本书的写法约定。本书要求:界面 = 一个类。现在就把例 1.1 改写成面向对象版本:

# 第1章 例1.2:用面向对象方式写第一个窗口(本书标准骨架)
import tkinter as tk


class App:                                   # ① 定义一个"应用"类,整个界面用这个类来管理
    def __init__(self, root):                # ② 构造方法:创建 App 对象时,传入主窗口 root
        self.root = root                     # ③ 把窗口存到 self.root,这样类里别的方法以后随时能用到它
        self.root.title("通讯录管理器")       # ④ 给窗口设个标题(不加这句,标题栏是默认的 tk)


if __name__ == "__main__":                   # ⑤ 当本文件被直接运行时,才执行下面
    root = tk.Tk()                           # ⑥ 创建主窗口
    App(root)                                # ⑦ 把窗口交给 App 类,App 在构造里设置好标题
    root.mainloop()                          # ⑧ 进入主循环,窗口显示出来

逐行说明(重点看①②③⑦):

运行例 1.2,你会看到一个标题为"通讯录管理器"的窗口——和例 1.1 的空白窗口相比,它有了名字。这就是"面向对象写法"的第一个可见成果。


1.7 OOP 落点(第 1 章只讲两点,不展开架构)★★

本章是全书 OOP 写法的总起,但只先建立两个最简单的认知,别被架构名词吓到:

  1. 为什么用类,而不是一堆全局变量:看例 1.2 的第 ③ 行 self.root = root。它把"窗口"这个重要对象存进了 App 实例。假如不用类,你得把 root 写成全局变量,函数之间传来传去、容易乱。用类,所有控件和状态都挂在 self 上,结构清晰、好维护。
  2. if __name__ == "__main__": 守卫的作用:保证"启动代码"只在直接运行本文件时执行;被 import 时不误弹窗。后面每章都这样写,看到它就放心。
至于"方法即回调""MVC 分层""自定义组件"这些进阶 OOP 概念,不急——它们会在该出现的时候自然登场。

1.8 易错清单(新手必看)★


1.9 本章练习

  1. 照例 1.2 写一个程序,让窗口标题变成"我的第一个 GUI"。
  2. 在例 1.2 的 __init__ 里加一行 self.root.geometry("400x300")(试着运行看看窗口变大了没,"宽x高" 里的 x 是英文字母 x)。
  3. 思考题:如果把第 ⑦ 行 App(root) 改成 app = App(root),再在 app 上调用方法会有什么好处?(提示:你以后能通过 app 这个变量访问这个应用对象。)