星级说明:★ 了解 · ★★ 理解 · ★★★ 掌握 · ★★★★ 重点必会。
tkinter 里每个控件其实有两套来源,这是新手最容易迷糊的地方:
import tkinter as tk,是 tkinter 自带的老牌控件。选项直观(比如能直接写 fg="red"、bg="blue" 改颜色),本书第 1~6 章用它打基础,最好理解。缺点是外观比较朴素、且不同操作系统长得不一样。from tkinter import ttk,全称 Themed Tk。它套用了操作系统当前的"主题",外观更现代、统一(Windows / macOS / Linux 都随系统风格自动变好看)。缺点是不能直接用 fg/bg 改颜色,要换肤得用 ttk.Style(见本附录末尾提醒)。本书约定:第 1~6 章为了让你先把"选项、布局、回调"这些概念吃透,统一用 tk.xxx 原生控件;从第 7 章起,优先改用 ttk.xxx,让界面更美观、更专业。下表每一行都标了"推荐用哪个",你照着选即可。
列说明:tk 名与ttk 名写"(无)"表示官方只有那一套;重要构造选项与常用方法只列最常用 2~4 个;推荐列给出本书建议,★ 越多越该优先掌握。
| 控件 | tk 名 | ttk 名 | 一句话用途 | 重要构造选项 | 常用方法 | 推荐 |
|---|---|---|---|---|---|---|
| 文字标签 | tk.Label | ttk.Label | 显示只读文字 / 图片 | text、font、fg/bg、image | config()、cget()、pack() | tk/ttk 皆可(★ 了解) |
| 按钮 | tk.Button | ttk.Button | 点击触发动作 | text、command、state、image | config()、invoke()、flash() | 优先 ttk.Button(★★★) |
| 单行输入框 | tk.Entry | ttk.Entry | 单行文本输入 | textvariable、show(密码掩码)、width | get()、insert()、delete() | 优先 ttk.Entry(★★★) |
| 多行文本框 | tk.Text | (无) | 多行富文本编辑 | width、height、wrap、font | get("1.0","end")、insert()、delete() | 仅 tk.Text(★★★) |
| 复选框 | tk.Checkbutton | ttk.Checkbutton | 多选勾选(可多开) | text、variable、onvalue/offvalue、command | config()、invoke()、deselect() | 优先 ttk.Checkbutton(★★★) |
| 单选框 | tk.Radiobutton | ttk.Radiobutton | 一组里选一个 | text、variable、value、command | config()、invoke()、select() | 优先 ttk.Radiobutton(★★★) |
| 下拉框 | (无) | ttk.Combobox | 下拉选择 + 可手输 | values、textvariable、state、width | get()、current()、set() | 仅 ttk.Combobox(★★★) |
| 滑块 | tk.Scale | ttk.Scale | 拖动选数值 | from_、to、orient、variable、command | get()、set()、config() | 优先 ttk.Scale(★★) |
| 微调框 | tk.Spinbox | ttk.Spinbox | 上下箭头调数值/列表 | from_/to、values、textvariable、increment | get()、set()、invoke() | 优先 ttk.Spinbox(★★) |
| 列表框 | tk.Listbox | (无) | 列表单选/多选 | listvariable、selectmode、height | insert()、delete()、get()、curselection() | 仅 tk.Listbox(★★) |
| 滚动条 | tk.Scrollbar | ttk.Scrollbar | 配合可滚动控件 | orient、command(接 yview/xview) | set()、get()、config() | 优先 ttk.Scrollbar(★★) |
| 树形/表格 | (无) | ttk.Treeview | 表格或树形数据 | columns、show、height、selectmode | insert()、delete()、get_children()、item()、heading() | 仅 ttk.Treeview(★★★★) |
| 容器框架 | tk.Frame | ttk.Frame | 装其它控件的容器 | padding、width、height、relief | 布局方法 + config() | 优先 ttk.Frame(★★) |
| 带标题分组框 | tk.LabelFrame | ttk.LabelFrame | 带标题的分组容器 | text、padding、labelanchor | config()、pack() | 优先 ttk.LabelFrame(★★) |
| 选项卡 | (无) | ttk.Notebook | 分页/标签页切换 | (无必须项)、padding | add()、tab()、select()、index() | 仅 ttk.Notebook(★★★) |
| 分隔窗格 | tk.PanedWindow | ttk.Panedwindow | 可拖动分隔的多窗格 | orient、showhandle、sashwidth | add()、panes()、sash_place() | 优先 ttk.Panedwindow(★) |
| 画布 | tk.Canvas | (无) | 画线/圆/图等图形 | width、height、bg、scrollregion | create_oval()、create_rectangle()、create_line()、delete() | 仅 tk.Canvas(★★★) |
| 进度条 | (无) | ttk.Progressbar | 显示任务进度 | orient、maximum、value、mode、length | start()、stop()、step()、config() | 仅 ttk.Progressbar(★★) |
| 菜单 | tk.Menu | (无) | 菜单栏 / 右键菜单 | tearoff、label | add_command()、add_cascade()、add_separator()、post() | 仅 tk.Menu(★★★) |
| 菜单按钮 | tk.Menubutton | ttk.Menubutton | 自带下拉菜单的按钮 | text、menu、direction | config()、pack() | 优先 ttk.Menubutton(★) |
| 长消息 | tk.Message | (无) | 自动换行的长文本 | text、aspect、font、width | config()、cget() | 仅 tk.Message(★,Label 更常用) |
tk.xxx。📌 记住口诀:"老牌基础用 tk,新潮美观用 ttk;ttk 独有记心头(Combobox/Treeview/Notebook/Progressbar),tk 独有别乱改(Text/Listbox/Canvas/Menu)。"
fg/bg !这是第 7 章之后最容易踩的坑:ttk.Button、ttk.Label 等 ttk 控件不支持 fg=/bg= 选项——你写了也不会报错,但颜色根本不变。要改 ttk 控件的颜色、字体、边距,必须走 ttk.Style。
下面是一段合法示例(仅演示写法,语法已校验通过):
# 附录A 示例:用 ttk.Style 给 ttk 控件换颜色和字体
import tkinter as tk
from tkinter import ttk
class App:
def __init__(self, root):
self.root = root
style = ttk.Style()
# 通过 Style 配置"TButton"类控件的样式(前景/背景/字体)
style.configure("TButton", foreground="white",
background="#3a7afe", font=("微软雅黑", 12))
# 创建按钮时指定 style="TButton" 才会套用上面的样式
btn = ttk.Button(root, text="蓝色按钮", style="TButton")
btn.pack(padx=20, pady=20)
if __name__ == "__main__":
root = tk.Tk()
App(root)
root.mainloop()一句话总结:改 tk 控件用fg/bg;改 ttk 控件用ttk.Style().configure(...)。 风格细节(不同主题名、如何改整个应用主题)在正文"样式与主题"章节展开。