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 参数关联共享变量 varvalue 参数设定该按钮被选中时赋予变量 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 参数可以设置组件排列的方向(topbottomleftright)。

示例:

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() 布局可以通过指定组件的绝对位置(xy 坐标)或者相对位置来放置组件。不过这种布局方式不太灵活,当窗口大小改变时,组件的位置可能不会自适应。

示例:

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

物联沃分享整理
物联沃-IOTWORD物联网 » Python GUI编程(Tkinter框架)

发表回复