Python GUI编程(Tkinter框架)
1.Tkinter是什么?
Tkinter是Python的标准GUI(图形用户界面)库,它是Python的Tcl/Tk GUI工具包的包装器。Tkinter允许Python程序员快速创建GUI应用程序,而无需深入了解底层的图形绘制细节。
2.安装Tkinter
Tkinter通常已经预装在Python中,所以不需要额外安装。你可以在Python环境中直接导入它:
Import tkinter as tk
不过,在某些 Linux 发行版中,可能需要安装单独的 Tk 开发包。例如在 Ubuntu 系统中,可以使用以下命令安装:
sudo apt - get install python3 - tk
3.基础概念
首先,了解Tkinter的基本概念,包括窗口(Window)、组件(Widgets)、事件(Events)和布局管理器(Layout Managers)。
主窗口
在Tkinter中,所有的组件和控件都是从主窗口派生的。主窗口是应用程序的最顶层窗口,所有的其他窗口和控件都是这个窗口的子元素。
import tkinter as tk
root = tk.Tk() # 创建主窗口
组件
组件是Tkinter中用于构建用户界面的基本元素,比如按钮(Button)、标签(Label)、文本框(Entry)等。每个组件都是tkinter.Widget
类的一个实例。(注:tkinter.Widget
是 Tkinter 库中的一个基类,它是所有 Tkinter 控件(组件)的父类。在 Tkinter 中,几乎所有的 GUI 控件都是 Widget
类的子类。Widget
类提供了所有控件共有的基本属性和方法,比如配置控件的属性、绑定事件等。)
label = tk.Label(root, text="Hello, Tkinter!") # 创建一个标签组件
事件
事件是用户与界面交互的结果,比如点击按钮、移动鼠标、按下键盘等。Tkinter允许你为这些事件编写回调函数,当事件发生时,这些函数会被调用。
def on_button_click():
print("按钮被点击了!")
button = tk.Button(root, text="点击我", command=on_button_click) # 按钮点击事件
布局管理器
Tkinter提供了几种布局管理器,用于自动管理组件的位置和大小。主要有三种布局管理器:
pack():最简单的布局管理器,按照组件添加的顺序进行排列。
grid():允许你以表格的形式放置组件,指定行和列。
place():允许你精确指定组件的位置(x, y坐标)。
# 使用pack布局管理器
label.pack()
# 使用grid布局管理器
label.grid(row=0, column=0)
# 使用place布局管理器
label.place(x=10, y=10)
4.创建第一个窗口
#创建一个简单的Tkinter窗口
import tkinter as tk
# 创建主窗口
root = tk.Tk()
root.title("我的第一个Tkinter窗口")
# 运行主循环
root.mainloop()
5.添加组件
import tkinter as tk
root = tk.Tk()
root.title("Tkinter组件")
# 添加一个标签
label = tk.Label(root, text="你好,Tkinter!")
# 将标签组件放置在主窗口中
label.pack()
# 添加一个按钮
def say_hello():
print("Hello, Tkinter!")
button = tk.Button(root, text="点击我", command=say_hello)
button.pack()
root.mainloop()
附:创建按钮代码解释
#定义函数 on_button_click:
def on_button_click():
print("按钮被点击了!")
#这一行定义了一个名为 on_button_click 的函数。
#当这个函数被调用时,它会执行 print("按钮被点击了!") 语句
#创建按钮:
button = tk.Button(root, text="点击我", command=on_button_click) # 按钮点击事件
#这行代码使用 Tkinter 库创建一个按钮组件。tk.Button 是 Tkinter 中的一个类,用于创建按钮。
#参数 root 是按钮的父组件,这意味着这个按钮将放置在之前创建的主窗口中。
#text="点击我" 设置按钮上显示的文本为“点击我”。
#command=on_button_click 指定当按钮被点击时,调用前面定义的 on_button_click 函数。这就实现了按钮的点击事件处理。
6.Tkinter 组件介绍
Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用。这些控件通常被称为控件或者部件。
Tkinter控件表(表格来源:Python GUI 编程(Tkinter) | 菜鸟教程)
控件 | 描述 |
---|---|
Button | 按钮控件;在程序中显示按钮。 |
Canvas | 画布控件;显示图形元素如线条或文本 |
Checkbutton | 多选框控件;用于在程序中提供多项选择框 |
Entry | 输入控件;用于显示简单的文本内容 |
Frame | 框架控件;在屏幕上显示一个矩形区域,多用来作为容器 |
Label | 标签控件;可以显示文本和位图 |
Listbox | 列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户 |
Menubutton | 菜单按钮控件,用于显示菜单项。 |
Menu | 菜单控件;显示菜单栏,下拉菜单和弹出菜单 |
Message | 消息控件;用来显示多行文本,与label比较类似 |
Radiobutton | 单选按钮控件;显示一个单选的按钮状态 |
Scale | 范围控件;显示一个数值刻度,为输出限定范围的数字区间 |
Scrollbar | 滚动条控件,当内容超过可视化区域时使用,如列表框。. |
Text | 文本控件;用于显示多行文本 |
Toplevel | 容器控件;用来提供一个单独的对话框,和Frame比较类似 |
Spinbox | 输入控件;与Entry类似,但是可以指定输入范围值 |
PanedWindow | PanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件。 |
LabelFrame | labelframe 是一个简单的容器控件。常用于复杂的窗口布局。 |
tkMessageBox | 用于显示你应用程序的消息框。 |
Button(按钮)
功能:按钮是一种可交互组件,用户点击按钮时能触发指定的操作,常用于执行特定功能,比如提交表单、确认操作等。
import tkinter as tk
def button_click():
print("按钮被点击啦!")
root = tk.Tk()
# 创建一个按钮组件,文本为'点击我',点击时执行button_click函数
button = tk.Button(root, text="点击我", command=button_click)
button.pack()
root.mainloop()
说明:在上述代码中,tk.Button()
用于创建按钮对象。text
参数设定了按钮上显示的文本内容,command
参数则绑定了一个函数(这里是 button_click
函数),意味着当按钮被点击时,就会执行这个绑定的函数。最后通过 button.pack()
将按钮添加到窗口中,利用 pack()
布局管理器按照默认顺序排列组件。
Entry(输入框)
功能:允许用户输入单行文本内容,常用于收集如用户名、简单搜索关键词等简短的用户输入信息。
示例:
import tkinter as tk
def get_input():
input_text = entry.get()
print("用户输入的内容是:", input_text)
root = tk.Tk()
# 创建一个输入框组件
entry = tk.Entry(root)
entry.pack()
button = tk.Button(root, text="获取输入", command=get_input)
button.pack()
root.mainloop()
说明:代码里首先用 tk.Entry()
创建了输入框对象。之后定义了 get_input
函数,在函数中通过 entry.get()
方法来获取用户在输入框里输入的文本内容。添加一个按钮用于触发获取输入内容的操作,同样借助 pack()
布局管理器把输入框和按钮添加到窗口中,方便用户操作与查看。
Text(文本框)
功能:提供一个多行的文本编辑区域,用户可以在其中输入、编辑以及查看较多数量的文本,例如编写文章、记录笔记等场景适用。
示例:
import tkinter as tk
root = tk.Tk()
# 创建一个文本框组件
text_box = tk.Text(root)
text_box.pack()
root.mainloop()
说明:通过 tk.Text()
创建了文本框对象,随后使用 text_box.pack()
把文本框添加到主窗口 root
中。用户在文本框里能够自由地输入多行文本,并且可以利用文本框自带的一些编辑功能(比如光标移动、选中文本等)进行文本的编辑操作。
Checkbutton(复选框)
功能:让用户能够从多个选项里选择一个或多个选项,常用于需要用户选择多项配置、偏好等情况,每个选项有选中和未选中两种状态。
示例:
import tkinter as tk
root = tk.Tk()
# 创建一个整型变量用于记录复选框状态
var1 = tk.IntVar()
# 创建一个复选框组件,文本为'选项1',关联变量var1
check_button1 = tk.Checkbutton(root, text="选项1", variable=var1)
check_button1.pack()
root.mainloop()
说明:先定义了 tk.IntVar()
类型的变量 var1
,用于和复选框关联起来记录其状态(选中时 var1
的值为 1,未选中时为 0)。然后使用 tk.Checkbutton()
创建复选框对象,text
参数设置复选框旁边显示的文本,variable
参数指定关联的变量。最后通过 check_button1.pack()
把复选框添加到窗口中,方便用户进行选择操作。
Radiobutton(单选按钮)
功能:用于在一组互斥的选项中选择唯一的一个选项,比如选择性别、选择一种支付方式等场景下使用。
示例:
import tkinter as tk
root = tk.Tk()
# 创建一个整型变量用于记录被选中的单选按钮的值
var = tk.IntVar()
# 创建第一个单选按钮组件,文本为'选项A',关联变量var,值设为1
radio_button1 = tk.Radiobutton(root, text="选项A", variable=var, value=1)
radio_button1.pack()
# 创建第二个单选按钮组件,文本为'选项B',关联变量var,值设为2
radio_button2 = tk.Radiobutton(root, text="选项B", variable=var, value=2)
radio_button2.pack()
root.mainloop()
说明:先是创建了 tk.IntVar()
类型的变量 var
,同一组的单选按钮都共享这个变量来记录被选中按钮的值。接着用 tk.Radiobutton()
分别创建两个单选按钮对象,对于每个单选按钮,text
参数设置旁边显示的文本,variable
参数关联共享变量 var
,value
参数设定该按钮被选中时赋予变量 var
的值。通过 pack()
布局管理器把单选按钮添加到窗口中,用户只能选择其中一个选项。
Listbox(列表框)
功能:展示一个项目列表,用户可以从中选择一个或多个项目,常用于呈现可供选择的多个数据项,像文件列表、商品列表等。
示例:
import tkinter as tk
root = tk.Tk()
# 创建一个列表框组件
listbox = tk.Listbox(root)
items = ["选项1", "选项2", "选项3"]
for item in items:
# 向列表框中插入各个项目
listbox.insert(tk.END, item)
listbox.pack()
root.mainloop()
说明:通过 tk.Listbox()
创建列表框对象后,定义了一个包含若干选项的列表 items
,接着利用循环和 listbox.insert(tk.END, item)
方法将每个选项依次插入到列表框中,最后使用 listbox.pack()
把列表框添加到窗口中,用户就能从中选择相应的项目了。
Scale(滑块)
功能:用户可以通过拖动滑块来选择一个数值,常用于调节连续变化的参数,例如音量大小、图像亮度等设置场景。
示例:
import tkinter as tk
root = tk.Tk()
# 创建一个水平方向的滑块组件,取值范围从0到100
scale = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL)
scale.pack()
root.mainloop()
说明:利用 tk.Scale()
创建滑块对象,from_
和 to
参数规定了滑块取值的范围,orient
参数指定滑块的方向(这里是 tk.HORIZONTAL
表示水平方向)。之后通过 scale.pack()
把滑块添加到窗口中,用户通过拖动滑块就能获取相应的数值,并且可以在程序中通过 scale.get()
方法获取滑块当前所代表的值。
Spinbox(微调框)
功能:类似带有上下箭头的输入框,用户可以点击箭头或者手动输入来选择一个数值,常应用于选择有限范围内的整数值或者特定的几个字符串值,比如选择年龄范围、选择预设的城市名称等。
示例:
import tkinter as tk
root = tk.Tk()
# 创建一个微调框组件,取值范围从1到10
spinbox = tk.Spinbox(root, from_=1, to=10)
spinbox.pack()
root.mainloop()
说明:使用 tk.Spinbox()
创建微调框对象,from_
和 to
参数定义了微调框的取值范围,用户既可以点击上下箭头按一定增量(默认是 1)改变数值,也可以手动输入符合要求的值。最后通过 spinbox.pack()
把微调框添加到窗口中,方便用户进行数值选择操作。
Menu(菜单)
功能:用于创建菜单栏以及下拉菜单,将多个相关的命令集合在一起,方便用户操作,常见于各种软件应用的顶部菜单栏等位置。
示例:
import tkinter as tk
root = tk.Tk()
# 创建菜单栏对象
menu_bar = tk.Menu(root)
# 创建文件下拉菜单对象,设置不可分离(tearoff=0)
file_menu = tk.Menu(menu_bar, tearoff=0)
# 在文件下拉菜单中添加'打开'命令选项
file_menu.add_command(text="打开")
# 在文件下拉菜单中添加'保存'命令选项
file_menu.add_command(text="保存")
# 将文件下拉菜单添加到菜单栏中,设置下拉菜单标签为'文件'
menu_bar.add_cascade(label="文件", menu=file_menu)
# 将菜单栏配置到根窗口
root.config(menu=menu_bar)
root.mainloop()
说明:首先创建 tk.Menu()
类型的菜单栏对象 menu_bar
,接着创建文件下拉菜单对象 file_menu
并设置其不可分离(通过 tearoff=0
)。然后利用 add_command()
方法向文件下拉菜单中添加具体的命令选项(如 “打开”、“保存”),再通过 add_cascade()
方法把文件下拉菜单添加到菜单栏里,最后通过 root.config(menu=menu_bar)
将整个菜单栏配置到根窗口 root
上,用户点击菜单栏的标签就能展开下拉菜单并选择相应命令。
Canvas(画布)
功能:提供一个绘图区域,可以在上面绘制各种图形(如直线、矩形、圆形、多边形等),还能用于展示图像、实现简单动画等复杂的可视化操作。
示例:
import tkinter as tk
root = tk.Tk()
# 创建一个宽度为200,高度为200的画布组件
canvas = tk.Canvas(root, width=200, height=200)
canvas.pack()
# 在画布上绘制一个矩形,指定左上角和右下角坐标
canvas.create_rectangle(50, 50, 150, 150)
root.mainloop()
说明:通过 tk.Canvas()
创建画布对象,设定好宽度和高度参数后,利用 canvas.pack()
把画布添加到窗口中。之后使用 canvas.create_rectangle()
这类 create_xxx()
系列方法(这里绘制矩形,不同图形有对应的创建方法)在画布上绘制相应的图形,并且后续还可以通过其他方法(如修改图形属性等)对绘制的图形做进一步操作。
7.布局管理
pack 布局
pack()
是一种简单的布局方式。它会按照组件添加的顺序将组件排列在窗口中。可以通过一些参数来调整布局,比如 side
参数可以设置组件排列的方向(top
、bottom
、left
、right
)。
示例:
import tkinter as tk
root = tk.Tk()
button1 = tk.Button(root, text="按钮1")
button1.pack(side = tk.LEFT)
button2 = tk.Button(root, text="按钮2")
button2.pack(side = tk.LEFT)
root.mainloop()
这个例子中,两个按钮会从左到右排列。
grid 布局
grid()
布局是按照表格的形式来排列组件的。通过指定行和列的位置来放置组件。
示例:
import tkinter as tk
root = tk.Tk()
label1 = tk.Label(root, text="姓名")
label1.grid(row = 0, column = 0)
entry1 = tk.Entry(root)
entry1.grid(row = 0, column = 1)
label2 = tk.Label(root, text="年龄")
label2.grid(row = 1, column = 0)
entry2 = tk.Entry(root)
entry2.grid(row = 1, column = 1)
root.mainloop()
在这个例子中,通过grid()方法将标签和输入框按照表格的形式排列,形成了一个简单的表单界面。
place 布局
place()
布局可以通过指定组件的绝对位置(x
、y
坐标)或者相对位置来放置组件。不过这种布局方式不太灵活,当窗口大小改变时,组件的位置可能不会自适应。
示例:
import tkinter as tk
root = tk.Tk()
button = tk.Button(root, text="一个按钮")
button.place(x = 50, y = 50)
root.mainloop()
这里的按钮会出现在距离窗口左上角(x=50,y=50)的位置。
8.事件处理
除了前面介绍的按钮点击事件,Tkinter 还可以处理很多其他事件,如鼠标移动、键盘按键等。
例如,处理鼠标进入和离开组件的事件:
import tkinter as tk
def enter(event):
print("鼠标进入组件")
def leave(event):
print("鼠标离开组件")
root = tk.Tk()
label = tk.Label(root, text="移动鼠标到这里")
label.pack()
label.bind("<Enter>", enter)
label.bind("<Leave>", leave)
root.mainloop()
在这个例子中,通过 bind()
方法将事件和对应的处理函数绑定起来。<Enter>
表示鼠标进入组件的事件,<Leave>
表示鼠标离开组件的事件。当这些事件发生时,会分别执行 enter()
和 leave()
函数。
9.结语
学习 Tkinter 需要不断地实践和尝试不同的组件组合、布局方式和事件处理方法,通过编写一些简单的图形界面程序,如计算器、简单的文本编辑器等来加深理解。同时,也可以参考 Tkinter 的官方文档获取更详细的信息。
Python的官方 Tkinter文档:
tkinter — Python interface to Tcl/Tk — Python 3.13.1 documentation
作者:chunyublog