Python入门学习教程:第 16 章 图形用户界面(GUI)编程
liuian 2025-09-04 11:50 19 浏览
16.1 什么是 GUI 编程?
图形用户界面(Graphical User Interface,简称 GUI)是指通过窗口、按钮、菜单、文本框等可视化元素与用户交互的界面。与命令行界面(CLI)相比,GUI 更加直观、易用,是大多数现代应用程序采用的交互方式。
Python 提供了多个 GUI 库,用于开发图形界面应用程序,常见的有:
- Tkinter:Python 自带的 GUI 库,轻量级、易于学习,适合快速开发简单的 GUI 应用。
- PyQt:功能强大的跨平台 GUI 库,支持丰富的组件和高级特性,但学习曲线较陡。
- wxPython:另一款跨平台 GUI 库,API 设计接近原生 GUI,兼容性好。
- Kivy:专注于移动应用和多点触控的 GUI 库,支持跨平台开发。
本章将重点介绍 Tkinter,因为它是 Python 标准库的一部分,无需额外安装,且足以满足基础 GUI 开发需求。
16.2 Tkinter 简介与环境准备
16.2.1 Tkinter 的特点
Tkinter 是 Python 绑定的 Tk GUI 工具包,具有以下特点:
- 简单易用:API 设计简洁,入门门槛低。
- 跨平台:可在 Windows、macOS、Linux 等操作系统上运行,且界面风格与系统保持一致。
- 轻量级:占用资源少,适合开发小型应用。
- 功能基本完备:提供常用的 GUI 组件和功能,满足大多数基础应用需求。
16.2.2 环境准备
Tkinter 是 Python 标准库的一部分,因此在安装 Python 时已自动包含,无需额外安装。可以通过以下代码验证 Tkinter 是否可用:
import tkinter as tkfrom tkinter import messagebox
# 验证Tkinter是否正常工作
root = tk.Tk()
root.withdraw() # 隐藏主窗口
messagebox.showinfo("验证", "Tkinter环境正常!")
root.destroy()
运行上述代码,如果弹出提示窗口,则说明 Tkinter 可以正常使用。
16.3 Tkinter 基本组件与使用
16.3.1 主窗口创建
使用 Tkinter 开发 GUI 应用的第一步是创建主窗口,通过tk.Tk()函数实现:
import tkinter as tk# 创建主窗口
root = tk.Tk()
# 设置窗口标题
root.title("我的第一个Tkinter窗口")
# 设置窗口大小(宽x高)
root.geometry("400x300")
# 进入消息循环(事件循环),保持窗口显示
root.mainloop()
运行上述代码,会显示一个标题为 “我的第一个 Tkinter 窗口”、大小为 400x300 的窗口。mainloop()方法用于启动事件循环,使窗口能够响应用户操作(如点击、输入等)。
16.3.2 常用组件
Tkinter 提供了丰富的 GUI 组件,以下是一些常用组件的使用方法:
1. 标签(Label)
标签用于显示文本或图像,不能与用户交互。
import tkinter as tkroot = tk.Tk()
root.title("标签示例")
root.geometry("300x200")
# 创建标签,设置文本、字体、前景色、背景色
label = tk.Label(
root,
text="欢迎使用Tkinter",
font=("SimHei", 12), # 字体为黑体,大小12
fg="blue", # 前景色(文本颜色)
bg="#f0f0f0" # 背景色
)
# 将标签放置到窗口中(pack()方法用于简单布局)
label.pack(pady=20) # pady设置上下边距
root.mainloop()
2. 按钮(Button)
按钮用于触发事件(如点击后执行某个函数)。
import tkinter as tkfrom tkinter import messagebox
def on_click():
"""按钮点击事件处理函数"""
messagebox.showinfo("提示", "按钮被点击了!")
root = tk.Tk()
root.title("按钮示例")
root.geometry("300x200")
# 创建按钮,设置文本和点击事件
button = tk.Button(
root,
text="点击我",
command=on_click, # 点击后调用on_click函数
width=10, # 按钮宽度
height=2 # 按钮高度
)
button.pack(pady=20)
root.mainloop()
3. 输入框(Entry)
输入框用于接收用户的单行文本输入。
import tkinter as tkdef get_input():
"""获取输入框内容"""
text = entry.get() # 获取输入框内容
label.config(text=f"你输入的是:{text}") # 更新标签文本
root = tk.Tk()
root.title("输入框示例")
root.geometry("300x200")
# 创建输入框
entry = tk.Entry(root, width=20)
entry.pack(pady=10)
# 创建按钮,点击后获取输入内容
button = tk.Button(root, text="获取输入", command=get_input)
button.pack(pady=5)
# 用于显示结果的标签
label = tk.Label(root, text="")
label.pack(pady=10)
root.mainloop()
4. 文本框(Text)
文本框用于接收或显示多行文本。
import tkinter as tkdef get_text():
"""获取文本框内容"""
# 获取文本框中所有内容(从1.0到end)
text = text_widget.get("1.0", tk.END)
label.config(text=f"文本框内容:{text.strip()}") # strip()去除末尾换行
root = tk.Tk()
root.title("文本框示例")
root.geometry("300x250")
# 创建文本框,设置宽度和高度
text_widget = tk.Text(root, width=30, height=5)
text_widget.pack(pady=10)
# 创建按钮,点击后获取文本框内容
button = tk.Button(root, text="获取文本", command=get_text)
button.pack(pady=5)
# 用于显示结果的标签
label = tk.Label(root, text="")
label.pack(pady=10)
root.mainloop()
5. 复选框(Checkbutton)
复选框用于让用户选择一个或多个选项。
import tkinter as tkdef show_selection():
"""显示选中的选项"""
selected = []
if var1.get() == 1:
selected.append("选项1")
if var2.get() == 1:
selected.append("选项2")
if var3.get() == 1:
selected.append("选项3")
label.config(text=f"你选中了:{', '.join(selected)}")
root = tk.Tk()
root.title("复选框示例")
root.geometry("300x200")
# 用于存储复选框状态的变量(1表示选中,0表示未选中)
var1 = tk.IntVar()
var2 = tk.IntVar()
var3 = tk.IntVar()
# 创建复选框
cb1 = tk.Checkbutton(root, text="选项1", variable=var1, command=show_selection)
cb2 = tk.Checkbutton(root, text="选项2", variable=var2, command=show_selection)
cb3 = tk.Checkbutton(root, text="选项3", variable=var3, command=show_selection)
cb1.pack(anchor=tk.W, padx=20, pady=5) # anchor=tk.W表示左对齐
cb2.pack(anchor=tk.W, padx=20, pady=5)
cb3.pack(anchor=tk.W, padx=20, pady=5)
# 用于显示结果的标签
label = tk.Label(root, text="")
label.pack(pady=10)
root.mainloop()
6. 单选按钮(Radiobutton)
单选按钮用于让用户从多个选项中选择一个。
import tkinter as tkdef show_choice():
"""显示选中的选项"""
label.config(text=f"你选中了:{var.get()}")
root = tk.Tk()
root.title("单选按钮示例")
root.geometry("300x200")
# 用于存储单选按钮选中值的变量
var = tk.StringVar(value="")
# 创建单选按钮(同一组单选按钮需使用相同的variable)
rb1 = tk.Radiobutton(root, text="选项A", variable=var, value="A", command=show_choice)
rb2 = tk.Radiobutton(root, text="选项B", variable=var, value="B", command=show_choice)
rb3 = tk.Radiobutton(root, text="选项C", variable=var, value="C", command=show_choice)
rb1.pack(anchor=tk.W, padx=20, pady=5)
rb2.pack(anchor=tk.W, padx=20, pady=5)
rb3.pack(anchor=tk.W, padx=20, pady=5)
# 用于显示结果的标签
label = tk.Label(root, text="")
label.pack(pady=10)
root.mainloop()
16.4 布局管理器
布局管理器用于控制组件在窗口中的位置和大小,Tkinter 提供了三种常用的布局管理器:pack()、grid()和place()。
16.4.1 pack () 布局
pack()是最简单的布局管理器,它按照组件添加的顺序自动排列(默认从上到下),通过side参数可以指定排列方向(tk.TOP、tk.BOTTOM、tk.LEFT、tk.RIGHT)。
示例:
import tkinter as tkroot = tk.Tk()
root.title("pack()布局示例")
root.geometry("300x200")
# 创建三个按钮,使用pack()布局
btn1 = tk.Button(root, text="按钮1")
btn1.pack(side=tk.TOP, fill=tk.X, padx=10, pady=5) # fill=tk.X表示水平方向填充
btn2 = tk.Button(root, text="按钮2")
btn2.pack(side=tk.TOP, fill=tk.X, padx=10, pady=5)
btn3 = tk.Button(root, text="按钮3")
btn3.pack(side=tk.TOP, fill=tk.X, padx=10, pady=5)
root.mainloop()
16.4.2 grid () 布局
grid()布局将窗口划分为网格(行和列),通过row和column参数指定组件所在的行和列,适合创建规则的布局。
示例:
import tkinter as tkroot = tk.Tk()
root.title("grid()布局示例")
root.geometry("300x200")
# 创建标签和输入框,使用grid()布局
tk.Label(root, text="用户名:").grid(row=0, column=0, padx=5, pady=10, sticky=tk.E)
tk.Entry(root).grid(row=0, column=1, padx=5, pady=10)
tk.Label(root, text="密码:").grid(row=1, column=0, padx=5, pady=5, sticky=tk.E)
tk.Entry(root, show="*").grid(row=1, column=1, padx=5, pady=5) # show="*"用于密码输入
# 按钮跨两列
tk.Button(root, text="登录").grid(row=2, column=0, columnspan=2, pady=10)
root.mainloop()
- row和column:指定组件所在的行和列(从 0 开始计数)。
- columnspan和rowspan:指定组件跨越的列数和行数。
- sticky:指定组件在单元格中的对齐方式(如tk.E表示右对齐,tk.W表示左对齐,tk.N表示上对齐,tk.S表示下对齐)。
16.4.3 place () 布局
place()布局通过指定组件的绝对位置(x和y坐标)或相对位置(relx和rely)来放置组件,灵活性高,但不利于窗口大小调整。
示例:
import tkinter as tkroot = tk.Tk()
root.title("place()布局示例")
root.geometry("300x200")
# 使用绝对位置放置按钮
btn1 = tk.Button(root, text="按钮1")
btn1.place(x=50, y=50, width=80, height=30) # x和y为坐标,width和height为宽高
# 使用相对位置放置按钮(relx和rely为0-1之间的比例)
btn2 = tk.Button(root, text="按钮2")
btn2.place(relx=0.6, rely=0.5, anchor=tk.CENTER) # anchor=tk.CENTER表示以中心为基准
root.mainloop()
16.5 事件处理
在 GUI 应用中,用户的操作(如点击按钮、输入文本、移动鼠标等)称为事件,对事件做出响应的过程称为事件处理。Tkinter 通过bind()方法为组件绑定事件。
16.5.1 常用事件
Tkinter 中的事件以字符串形式表示,常用的事件有:
- <Button-1>:鼠标左键点击(1 表示左键,2 表示中键,3 表示右键)。
- <ButtonRelease-1>:鼠标左键释放。
- <Motion>:鼠标移动。
- <Enter>:鼠标进入组件。
- <Leave>:鼠标离开组件。
- <Key>:键盘按键按下。
- <Return>:回车键按下。
16.5.2 绑定事件
使用组件.bind(事件, 处理函数)为组件绑定事件,处理函数需要接收一个event参数,包含事件的相关信息(如坐标、按键等)。
示例:
import tkinter as tkdef on_click(event):
"""鼠标点击事件处理函数"""
print(f"鼠标在位置({event.x}, {event.y})被点击")
def on_key(event):
"""键盘事件处理函数"""
print(f"按下的键:{event.keysym}")
root = tk.Tk()
root.title("事件处理示例")
root.geometry("300x200")
# 创建一个标签,绑定鼠标点击事件
label = tk.Label(root, text="点击我或按键盘", bg="#f0f0f0", width=30, height=10)
label.pack(pady=20)
label.bind("<Button-1>", on_click) # 绑定鼠标左键点击事件
# 为窗口绑定键盘事件
root.bind("<Key>", on_key)
root.mainloop()
16.6 示例:简易计算器
使用 Tkinter 开发一个简易的计算器,支持加减乘除运算。
import tkinter as tkclass Calculator:
def __init__(self, root):
self.root = root
self.root.title("简易计算器")
self.root.geometry("300x400")
self.root.resizable(False, False) # 禁止窗口大小调整
# 显示框
self.display_var = tk.StringVar()
self.display = tk.Entry(
root,
textvariable=self.display_var,
font=("SimHei", 20),
justify=tk.RIGHT, # 右对齐
bd=10 # 边框宽度
)
self.display.grid(row=0, column=0, columnspan=4, sticky="nsew")
# 按钮布局
buttons = [
("7", 1, 0), ("8", 1, 1), ("9", 1, 2), ("/", 1, 3),
("4", 2, 0), ("5", 2, 1), ("6", 2, 2), ("*", 2, 3),
("1", 3, 0), ("2", 3, 1), ("3", 3, 2), ("-", 3, 3),
("0", 4, 0), (".", 4, 1), ("=", 4, 2), ("+", 4, 3),
("C", 5, 0), ("←", 5, 1)
]
# 创建按钮
for (text, row, col) in buttons:
btn = tk.Button(
root,
text</doubaocanvas>
相关推荐
- office和visio安装顺序(office和visio怎么一起安装)
-
在某些情况下,安装Visio可能会发生与Office365冲突的问题。这是因为Visio和Office365具有不同的版本,可能会导致安装时出现错误或兼容性问题。为了避免这种冲突,...
- 电脑中病毒的原因(电脑中病毒正常吗)
-
电脑中毒的原因有以下几方面:1.网页被挂病毒。2.电脑裸奔,无防病毒软件。3.执行一些不安全的程序。4.U盘等不安全介质。5.电脑漏洞不及时补,被后台种毒。为了电脑不中病毒要注意以下几方面:1.更新系...
- 手机psd转换成jpg最简单方式
-
可以使用photoshop工具,方法如下:1、首先打开PS软件,然后选择自己需要的JPG格式的图片,在PS中打开。2、接下来先按快捷键“Ctrl+j”将图片复制出来,防止后面操作对原图片有损...
- win7提示激活码过期怎么办(win7激活已过期)
-
以win7为例,出现这样的问题原因分析:电脑的win7系统激活过又重新提示要激活的原因是因为微软对网络上的秘钥进行封杀所以导致我们激活无效。具体的解决方法:1、我们打开dos命令窗口,在创立中输入“s...
- 联想笔记本光驱驱动下载(联想电脑光驱驱动器在哪)
-
开机时进入BIOS,具体按什么牌子不同,按键也不同,开机有提示的,选择启动项,把光驱启动的顺序放到第一.按F10保存,重新启动就是光驱启动啦不需要设置光驱驱动,笔记本自带光驱驱动光驱是电脑的硬件设备,...
- win10装机必备实用软件(win10电脑装机必备软件)
-
1、office大部分的版本如office2007、office2000、office2011、office2013、office2016、office365等都支持win10。2、需要注意...
- 迅雷无法下载的链接用什么下载
-
1.可以使用其他下载工具代替迅雷。2.迅雷可能无法下载的原因有很多,比如网络问题、软件故障等。其他下载工具可以提供类似的功能,但可能具有更好的稳定性和兼容性。3.一些常见的替代迅雷的下载工具包括...
- apple官方网站(apple官方网站旗舰店)
-
1、首先打开浏览器,输入https://www.apple.com/;2、即可浏览苹果官网。 苹果公司(AppleInc.)是美国一家高科技公司。由史蒂夫·乔布斯、斯蒂夫·沃兹尼亚克和罗·韦恩(R...
- 哪些手机用鸿蒙系统(都什么手机能用鸿蒙系统)
-
截至目前,国内有以下几款手机品牌可以装鸿蒙系统:1.华为:华为Mate40系列、P40系列、Mate30系列、MatePadPro系列等。2.荣耀:荣耀V40、荣耀30系列、荣耀X10系列等...
- 手机u盘读不出来了怎么修复(手机u盘读取不出来)
-
1、手机不支持OTG功能,所以将U盘连接到手机后,手机无法识别U盘的内容,因此显示不了;这种情况只能换台支持OTG功能的手机来连接U盘才行。2、手机支持OTG功能,但是使用的OTG线质量有问题导致无法...
- 笔记本散热器买哪种好(笔记本散热器买哪种好贴吧)
-
散热器有十大品牌:九州风神、超频三,酷冷至尊Tt、AVC、思民、捷冷、安钛克Antec、安耐美Enermax、海盗船Corsair。能位列十大品牌,每一种的质量和功能都有保障。、目前网上销量最高的是九...
-
- 打印机驱动一直安装失败(打印机驱动一直安装失败怎么办)
-
打印机驱动程序安装失败需要对电脑进行其他设置,详细步骤如下:1,在电脑桌面上找到【计算机】并用鼠标右击。2,右击后在出现的选项中找到【管理】选项并点击打开。3,接下里会进入到计算机控制台界面,在这里要根据自己的电脑选择64位或者32位,选择...
-
2026-01-14 12:55 liuian
- ctrl加谁是截图(ctrl和什么键可以截图)
-
第一种:Ctrl+PrScrn使用这个组合键截屏,获得的是整个屏幕的图片第二种:Alt+PrScrn这个组合键截屏,获得的结果是当前窗口的图片第三种:打开qq,使用快捷键Ctrl+...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
