【Python 提高】GUI 界面 Tkinter 库应用开发指南(完善中。。。)

部署运行你感兴趣的模型镜像

【Python 提高】GUI 界面开发指南——Tkinter 库。

一、认识 Python 和 GUI 开发

1、认识 Python

诞生:1989 年圣诞节荷兰程序员 Guido van Rossum 在阿姆斯特丹开始开发 Python,目标是创建一种易读、简洁且开放的语言,弥补 ABC 语言的不足。Python 单词原意为蟒蛇,但命名灵感源自喜剧剧集《Monty Python's Flying Circus》,Python 一名的创作意与原意无关,但在后来 Python 语言的图标上也有了蟒蛇的图案,象征着 Python 的灵活性和强大的功能‌。

发展:(大版本更新)

1994年:Python 1.0 发布

2000年:Python 2.0 里程碑更新

2008年:Python 3.0(Python 3000) 发布

至今:Python 3.0 版本

语言:Python 是一种高级、解释型、通用编程语言,代码简洁易读,支持跨平台开发,拥有丰富的生态,多范式支持,开源免费,应用领域广泛,功能强大。在众多编程语言排行榜上,Python 都位居前列(TIOBE 2025 评分 23.88%)。

代码:代码风格简洁、明确、优雅,Python 以可读性为核心的设计哲学,形成了一套独特的代码风格规范(PEP 8),核心原则(Python 之禅)有优美胜于丑陋,简洁胜于复杂,可读性至上。"代码是写给人看的,只是顺带让机器执行" —— Guido van Rossum。其中编译器强制性的规则是代码严格缩进。

2、认识 GUI

图形用户界面(Graphical User Interface) 允许用户通过视觉组件(按钮、输入框、窗口等)与程序交互,替代命令行操作。

核心价值:降低使用门槛(非技术用户友好),提升操作效率(可视化反馈),增强数据展示能力(图表、多媒体)

Python库:

库名学习难度功能强度适用场景
Tkinter★☆☆☆☆★★☆☆☆简单工具、快速原型
PyQt/PySide★★★★☆★★★★★商业级复杂应用
wxPython★★★☆☆★★★★☆需原生外观的跨平台应用
Kivy★★★★☆★★★★☆移动端/触控应用

从表中可以看出 Python 中的 Tkinter 库简单易学,但功能性一般,适用于简单工具,桌面端简单应用的开发。

二、Python 中的 Tkinter 库

Tkinter 是 Python 的标准 GUI 工具包,是 Tk GUI 工具包的 Python 接口。Tk 本身最初是为 Tcl 语言设计的,但凭借其简洁、开源和跨平台的特性,通过 Tkinter 被广泛应用于 Python 中,Tkinter 作为 Python 内置库,它提供了快速创建跨平台图形界面的能力。

在我们安装 Python 时(自定义选项),会看到如图所示选项:

安装 Python 时默认会附带安装 Tkinter 库,当然也可以选择不附带安装 Tkinter 库。

Tkinter 库的核心要素:组件、布局、事件

特点介绍

特性说明
内置无需安装Python 标准库(import tkinter
跨平台支持 Windows/macOS/Linux
轻量级安装包仅增加约 1-2 MB
易学性语法简单,文档丰富
组件丰富20+ 基础控件 + 扩展组件

核心组件体系

1、基础组件

组件功能示例创建
Label文本/图像显示Label(root, text="Hello")
Button可点击按钮Button(root, text="OK", command=func)
Entry单行文本输入Entry(root, width=20)
Text多行文本编辑Text(root, height=10)
Frame容器控件Frame(root, borderwidth=2)

2、高级组件

组件用途
Listbox选项列表
Canvas绘图区域(支持图形、图像)
Menu菜单栏/右键菜单
Scale滑块控件
Treeview树形表格(需 ttk)

适用场景与功能限制

适用:

  • 小型工具开发(文件处理/数据转换)

  • 教学演示

  • 快速原型验证

  • 硬件控制界面(树莓派项目)

限制

  • 界面美观度有限

  • 复杂表格、图表支持弱

  • 无硬件加速图形

概括总结

Tkinter 是 Python GUI 开发的瑞士军刀

  • 零成本快速构建基础界面

  • 通过 ttk 实现现代化外观

  • 事件驱动模型处理用户交互

  • 特别适合小型工具开发和硬件项目界面

三、走进 GUI 开发——Tkinter 库

1、导入 Tkinter 库

Tkinter 作为 Python 的内置库,直接导入即可。(注:本文代码以 Python3.0 版本为例)

import tkinter

 但通常为了调用函数方便,常写作:

import tkinter as tk

另外,我们可以通过以下方法查看 Tkinter 库的版本:

import tkinter
print(tkinter.TkVersion)

2、Tkinter 界面坐标模式

坐标系:Tkinter 生成的界面中坐标系如下图所示,以界面容器左上角顶点为坐标原点(0 , 0),x 轴为水平轴,正方向水平向右;y 轴为竖直轴,正方向竖直向下。界面坐标系是在界面容器中的坐标系,不包括标题栏、菜单栏、滑框栏等。

其中,坐标单位是以 1 个像素为单位的。

Tkinter 窗口如下图所示,其中标题栏和界面容器是窗口与生俱来的,菜单栏和滑块栏是创建的。

3、Tkinter 中颜色规则

Tkinter 中颜色有两种表示方式:英文字母表示 十六进制表示。

Tkinter 中如果不指定颜色,那么为默认的浅灰色,叫作 SystemButtonFace

(1)英文字母表示

基础颜色(16种)
颜色名中文名颜色名中文名
aliceblue爱丽丝蓝antiquewhite古董白
aqua水色aquamarine碧绿色
azure天蓝色beige米色
bisque橘黄色black黑色
blanchedalmond杏仁白blue蓝色
blueviolet蓝紫色brown棕色
burlywood实木色cadetblue军蓝色
全部颜色(140 种)
colors=[
    'aliceblue', 'antiquewhite', 'antiquewhite1', 'antiquewhite2',
    'antiquewhite3', 'antiquewhite4', 'aqua', 'aquamarine',
    'aquamarine1', 'aquamarine2', 'aquamarine3', 'aquamarine4',
    'azure', 'azure1', 'azure2', 'azure3', 'azure4', 'beige',
    'bisque', 'bisque1', 'bisque2', 'bisque3', 'bisque4', 'black',
    'blanchedalmond', 'blue', 'blue1', 'blue2', 'blue3', 'blue4',
    'blueviolet', 'brown', 'brown1', 'brown2', 'brown3', 'brown4',
    'burlywood', 'burlywood1', 'burlywood2', 'burlywood3', 'burlywood4',
    'cadetblue', 'cadetblue1', 'cadetblue2', 'cadetblue3', 'cadetblue4',
    'chartreuse', 'chartreuse1', 'chartreuse2', 'chartreuse3', 'chartreuse4',
    'chocolate', 'chocolate1', 'chocolate2', 'chocolate3', 'chocolate4',
    'coral', 'coral1', 'coral2', 'coral3', 'coral4',
    'cornflowerblue', 'cornsilk', 'cornsilk1', 'cornsilk2', 'cornsilk3', 'cornsilk4',
    'cyan', 'cyan1', 'cyan2', 'cyan3', 'cyan4',
    'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgoldenrod1', 'darkgoldenrod2',
    'darkgoldenrod3', 'darkgoldenrod4', 'darkgray', 'darkgreen', 'darkgrey',
    'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkolivegreen1', 'darkolivegreen2',
    'darkolivegreen3', 'darkolivegreen4', 'darkorange', 'darkorange1', 'darkorange2',
    'darkorange3', 'darkorange4', 'darkorchid', 'darkorchid1', 'darkorchid2',
    'darkorchid3', 'darkorchid4', 'darkred', 'darksalmon', 'darkseagreen',
    'darkseagreen1', 'darkseagreen2', 'darkseagreen3', 'darkseagreen4', 'darkslateblue',
    'darkslategray', 'darkslategray1', 'darkslategray2', 'darkslategray3', 'darkslategray4',
    'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deeppink1',
    'deeppink2', 'deeppink3', 'deeppink4', 'deepskyblue', 'deepskyblue1',
    'deepskyblue2', 'deepskyblue3', 'deepskyblue4', 'dimgray', 'dimgrey',
    'dodgerblue', 'dodgerblue1', 'dodgerblue2', 'dodgerblue3', 'dodgerblue4',
    'firebrick', 'firebrick1', 'firebrick2', 'firebrick3', 'firebrick4',
    'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold',
    'gold1', 'gold2', 'gold3', 'gold4', 'goldenrod',
    'goldenrod1', 'goldenrod2', 'goldenrod3', 'goldenrod4', 'gray',
    'green', 'green1', 'green2', 'green3', 'green4',
    'greenyellow', 'grey', 'honeydew', 'honeydew1', 'honeydew2',
    'honeydew3', 'honeydew4', 'hotpink', 'hotpink1', 'hotpink2',
    'hotpink3', 'hotpink4', 'indianred', 'indianred1', 'indianred2',
    'indianred3', 'indianred4', 'indigo', 'ivory', 'ivory1',
    'ivory2', 'ivory3', 'ivory4', 'khaki', 'khaki1',
    'khaki2', 'khaki3', 'khaki4', 'lavender', 'lavenderblush',
    'lavenderblush1', 'lavenderblush2', 'lavenderblush3', 'lavenderblush4', 'lawngreen',
    'lemonchiffon', 'lemonchiffon1', 'lemonchiffon2', 'lemonchiffon3', 'lemonchiffon4',
    'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrod', 'lightgoldenrodyellow',
    'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon',
    'lightseagreen', 'lightskyblue', 'lightslateblue', 'lightslategray', 'lightslategrey',
    'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 'linen',
    'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid',
    'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise',
    'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin',
    'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab',
    'orange', 'orangered', 'orchid', 'palegoldenrod', 'palegreen',
    'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru',
    'pink', 'plum', 'powderblue', 'purple', 'red',
    'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown',
    'seagreen', 'seashell', 'sienna', 'silver', 'skyblue',
    'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen',
    'steelblue', 'tan', 'teal', 'thistle', 'tomato',
    'turquoise', 'violet', 'wheat', 'white', 'whitesmoke',
    'yellow', 'yellowgreen'
]
说明
  1. 大小写不敏感:所有颜色名称不区分大小写,REDred Red 效果相同

  2. 系统支持:这些颜色名在 Windows/macOS/Linux 上均可使用

  3. 颜色变体:带数字后缀的颜色名(如 red1 red4)表示同色系的深浅变化

  4. 灰度表示gray/grey 可互换,数字后缀表示灰度级别(gray0 = 黑, gray100 = 白)

  5. 备用拼写graygrey 是等价的,dimgray dimgrey 也是等价的

(2)十六进制表示

十六进制颜色表示法(Hex Color Codes)是数字设计中最常用的颜色编码系统,广泛用于网页设计、图形软件和编程中(包括Tkinter)

基本结构

十六进制颜色代码由“#”符号+6位字符组成,格式为:#RRGGBB

分段含义范围说明
RR红色分量00-FF00(最小) → FF(最大)
GG绿色分量00-FF00(最小) → FF(最大)
BB蓝色分量00-FF00(最小) → FF(最大)

示例:

  • #FF0000 → 纯红色(R:255, G:0, B:0)

  • #00FF00 → 纯绿色

  • #0000FF → 纯蓝色

字符编码原理
字符十进制值字符十进制值
0088
1199
22A10
33B11
44C12
55D13
66E14
77F15

计算原理
每个颜色分量 = 第一位值 × 16 + 第二位值
示例
#3A7B2F 的绿色分量 7B7×16 + 11×1 = 112 + 11 = 123

常见颜色速查表
颜色名称十六进制颜色名称十六进制
纯白#FFFFFF深灰#333333
纯黑#000000浅灰#CCCCCC
正红#FF0000玫红#FF0077
草绿#00FF00墨绿#008844
天蓝#0000FF靛蓝#4A0082
明黄#FFFF00橘黄#FF8800
品红#FF00FF浅紫#CC99FF
青色#00FFFF青绿#00AA88

通过掌握十六进制颜色表示法,可以精确控制界面视觉效果,创建专业级的GUI应用。

4、Tkinter 中的窗口

窗口(Window)是 Tkinter 的基础容器,所有 GUI 组件都放置在窗口中。

Tkinter 中窗口有两类,主窗口(Tk)和子窗口(Toplevel),其中,一个 Python 文件中可以有多个子窗口但只能有一个主窗口,否则可能会出现问题(但出现问题根据编译环境不同有时不是必然结果,也可能不出现错误,但根据规范不建议在一个 Python 文件中创建多个主窗口,因为这样会引起不稳定性),多个窗口可以同时显示在屏幕上;窗口的显示和事件的交互依赖事件循环 mainloop(),文件中必须包含,所有窗口共享同一个事件循环;子窗口也能创建自己的子窗口,子窗口依赖上一级窗口,当子窗口的上一级窗口被关闭时,子窗口也会被关闭。

特性主窗口 (Tk())子窗口 (Toplevel())
数量限制只能有1个可以有多个
创建方式tk.Tk()tk.Toplevel(parent)
关闭影响终止整个应用只关闭自身
位置关系底层窗口显示在父窗口之上
生命周期整个应用期间独立于其他窗口
事件循环依赖必须存在依赖主窗口的事件循环

(1)创建主窗口(根窗口)

import tkinter as tk

root = tk.Tk()
root.mainloop()

(2)设置窗口属性

属性方法示例
窗口标题title()root.title("我的应用")
窗口尺寸geometry("宽x高")root.geometry("800x600")
背景色configure(bg="颜色")root.configure(bg="#F0F0F0")
图标iconbitmap("图标路径")root.iconbitmap("icon.ico")
透明度attributes("-alpha", 0.0-1.0)root.attributes("-alpha", 0.9)
置顶attributes("-topmost", True)root.attributes("-topmost", 1)
全屏attributes("-fullscreen", True)root.attributes("-fullscreen", True)

注意:窗口尺寸中“geometry("宽x高")”的宽和高之间是小写字母“x”。

(3)窗口行为控制

功能方法示例
禁止调整大小resizable(False, False)root.resizable(0, 0)
最小化窗口iconify()root.iconify()
恢复窗口deiconify()root.deiconify()
关闭窗口destroy()root.destroy()
设置最小/最大尺寸minsize(), maxsize()root.minsize(400, 300)

(4)窗口位置控制

tkinter 界面在屏幕上的坐标系与在tkinter界面容器中的类似,也是以左上角为坐标原点,横纵轴也类似

设置窗口位置与设置窗口尺寸共用一个方法geometry("宽x高+x偏移+y偏移"),例如geometry("800x600+400+300")表示创建一个像素大小尺寸为“800x600”的窗口,并将其放置在界面左上角距离屏幕左边缘“x”像素,距离屏幕上边缘“y”像素的位置。

如下面代码,先获取屏幕分辨率,让后将窗口居中放置。

# 获取屏幕尺寸
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

# 窗口居中
x = (screen_width - window_width) // 2
y = (screen_height - window_height) // 2
root.geometry(f"{window_width}x{window_height}+{x}+{y}")

以上使用的方法是正偏移方法,其中正偏移方法是以屏幕左边缘和屏幕上边缘为基准的,对于 Tkinter 界面来说是以左上角顶点为参考点的,那么负偏移方法则是以屏幕右边缘和屏幕下边缘为基准的,对于 Tkinter 界面来说是以右下角顶点为参考点的

负偏移方法即 geometry("宽x高-x偏移-y偏移"),例如 geometry("800x600-400-300")表示创建一个像素大小尺寸为“800x600”的窗口,并将其放置在界面右下角距离屏幕右边缘“x”像素,距离屏幕下边缘“y”像素的位置。

总结表格

参数基准点方向示例效果
+X偏移屏幕左边缘向右为正+100距左100像素
-X偏移屏幕右边缘向左为负-100距右100像素
+Y偏移屏幕上边缘向下为正+50距顶50像素
-Y偏移屏幕下边缘向上为负-50距底50像素
参考点窗口左上角--窗口定位的锚点

(5)mainloop() 相关说明

在 Tkinter 中,创建窗口后不调用 mainloop() 有时也能看到窗口显示,但这不是可靠的行为,并且会导致程序功能不完整

不写 mainloop() 也能显示窗口的原因(了解即可)

  1. Python 交互模式下的特殊行为:在 Python 的交互式环境(如 IDLE 或 IPython)中运行时,交互环境有自己的事件循环,可能临时接管了 Tkinter 的事件处理,但这不是 Tkinter 的正式工作方式,不可靠

  2. 某些 IDE 的辅助功能:像 PyCharm 这样的 IDE 可能在后台运行了部分事件处理,但当你将程序导出为独立脚本时,这种行为会消失

  3. update()或update_idletasks()的间接调用:如果在创建窗口后调用了这些方法(可能通过其他组件间接触发),这些方法会处理部分待处理事件,可能使窗口短暂显示

不写 mainloop() 会出现什么问题

  • 事件循环缺失

    • 窗口可能显示,但无法响应任何事件

    • 按钮点击、键盘输入、窗口关闭等操作都不会有效果

  • 程序立即退出

    • 在独立脚本中,没有 mainloop() 时程序会立即结束

    • 窗口可能只闪现一下就关闭了

  • 资源管理问题

    • 没有事件循环,窗口无法正确释放资源

    • 可能导致内存泄漏或程序无法正常终止

调用 mainloop() 相关说明

  • 必须调用 mainloop()

    • 对于任何实际可用的 Tkinter 应用

    • 确保窗口能正常响应用户交互

  • 调用位置

    • 在设置好所有界面组件后调用

    • 通常是脚本的最后一行有效代码

  • 调用次数

    • 整个应用只需调用一次(在创建主窗口后)

    • 所有窗口共享同一个事件循环

总结:虽然在某些特殊环境下不写 mainloop() 可能看到窗口显示,但这绝不是正确的做法。

5、Tkinter 中的布局

Python Tkinter 库提供了三种主要的布局管理器(layout managers/geometry managers)来排列和放置窗口中的组件(widgets),选择合适的布局方法对于创建美观且功能良好的 GUI 应用至关重要。

三种主要布局管理器

  1. pack 方法(自适应相对位置控制)
  2. grid 方法
  3. place 方法

在介绍布局基本方法时,使用

(1)pack 方法

pack() 是最简单的布局管理器,按照添加顺序将组件排列在父容器中。

pack() 方法是控件间相对位置布局管理器,用户只需制定相对位置,具体精确位置有此方法自己确定,这使此方法简单易用,但控件布局灵活性极小。

widget.pack(options)

6、Tkinter 中的控件

(1)控件大全与介绍

控件功能及用途
Label标签控件,用来在窗口上显示文本和图片
Message消息控件,用来显示多行文本,与 Label 功能类似
Button按钮控件,用户可以点击按钮,点击事件将会传递给设置的回调函数
Entry文本输入框控件,用户可以输入文字,但只能在一行输入
Text多行文本输入框控件,用户可以输入多行文字,自由换行
Canvas画布控件,可以在上面显示基本图形、文字、图片
Frame框架控件,作为一个小容器,相当于给组件分组。
LabelFrame文字框架控件,和Frame不同的是,框架外面多了文本提示
Menu菜单控件,在窗口上显示菜单,或定义弹出式菜单。
Menubutton菜单按钮控件,是Button的样子,点击后弹出一个菜单。
Checkbutton多选按钮,用户可以勾选或取消勾选。
Radiobutton单选按钮,用户可以在同类的Radiobutton中选择一个,无法取消勾选
Listbox列表框组件,可以显示一个字符串的列表
Scrollbar滚动条控件,用来添加一个滚动条控制滚动
Scale尺度条控件,用来添加一个数字滑块,用户可以滑动调整数值。
Spinbox数字选值框控件,用户既可以输入数字,也可以按调节按钮调整数值。
OptionMenu选项菜单,用户可以从下拉菜单中选择一个值,但是不能自己输入。
PanedWindow分栏容器控件,和Frame类似,但是有更多的功能设定,比如用户可以调节大小
Toplevel上层窗口控件,可以定义某个窗口的子窗口。

博客日志:

  1. 开始于(未知 In the School)
  2. 第一次发布于(具体未知,约2025.8.14-15左右 优快云博客起航——第一篇博客),本次发布只含有 Python、GUI 介绍和 Tkinter 库的基础介绍(布局前内容)
  3. 更新(一)2025.8.26,本次更新丰富了 Tkinter 的简介,布局内容,控件内容,并优化了排版(开始对中文与英文、数字等中间添加空格)

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HAH-HAH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值