最近在用Tkinter做桌面端的应用,这里做个简单的记录
前言
Tkinter 是 Python 的标准 GUI(图形用户界面)库,它是一个轻量级框架,使用方便,适合快速开发桌面应用。通过 Tkinter,可以创建窗口、按钮、文本框、标签、菜单、对话框等常见的 GUI 组件。
1、Tkinter 组件概述
- 主窗口:应用程序的主窗口(Tk 对象)。
- 标签 (Label):用于显示文本或图片。
- 按钮 (Button):用于触发特定事件或操作。
- 文本框 (Entry):单行输入框,用于接收用户输入。
- 多行文本框 (Text):用于接收多行文本输入。
- 复选框 (Checkbutton):用于显示二元状态(选中/未选中)。
- 单选按钮 (Radiobutton):一组互斥的按钮,用户只能选择一个。
- 列表框 (Listbox):用于显示列表项。
- 菜单 (Menu):用于创建下拉菜单、上下文菜单等。
- 框架 (Frame):用于组织布局,可以包含其他组件。
1.1 Tkinter 的核心组件详细介绍
import tkinter as tk# 创建主窗口
root = tk.Tk()
root.title("Tkinter Example")
root.geometry("400x300") # 设置窗口大小# 创建标签
label = tk.Label(root, text="Hello, Tkinter!", font=("Arial", 16))
label.pack(pady=10) # 使用 pack 布局管理器# 创建按钮,点击按钮时触发事件
def on_button_click():label.config(text="Button Clicked!")button = tk.Button(root, text="Click Me", command=on_button_click)
button.pack(pady=10)# 进入主循环,显示窗口
root.mainloop()
1.1.1. Tk (主窗口)
- root = tk.Tk() 创建主窗口。
- root.title(“Title”) 设置窗口标题。
- root.geometry(“400x300”) 设置窗口的初始大小。
1.1.2 Label (标签)
- label = tk.Label(root, text=“Hello, Tkinter!”) 创建一个标签,text 是要显示的内容。
- label.pack() 将标签放置在主窗口中,使用 pack() 布局管理器。
1.1.3 Button (按钮)
- button = tk.Button(root, text=“Click Me”, command=on_button_click) 创建一个按钮,command 绑定点击按钮时调用的函数。
1.1.4 Entry (文本框)
- entry = tk.Entry(root) 创建单行文本输入框。
- entry.get() 获取文本框中的值。
- entry.insert(0, “default text”) 在文本框中插入默认文本。
1.1.5 Text (多行文本框)
- text = tk.Text(root) 创建多行文本框,用于接收大段文本。
- text.insert(“1.0”, “Enter your text here”) 在文本框的第1行第0列插入文本。
- text.get(“1.0”, tk.END) 获取文本框内容。
1.1.6 Menu (菜单)
menubar = tk.Menu(root)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
root.config(menu=menubar)
1.1.7Frame (框架)
- frame = tk.Frame(root) 创建框架,用于组织布局。
2、Tkinter 的布局管理器
Tkinter 提供了三种布局管理器,分别是 pack、grid 和 place:
- pack():根据组件的顺序自动排列布局。
- grid():基于网格系统进行布局,可以将组件放在指定的行和列中。
- place():基于绝对坐标进行布局,灵活度高,但需手动控制位置。
杂记
1、StringVar
StringVar 是 Tkinter 提供的一个特殊变量类,用于与 Tkinter 界面组件中的字符串值进行绑定和控制。它可以用于追踪、设置和更新字符串类型的变量,从而实现界面组件的动态数据更新。
StringVar 通常用于和 Label、Entry 等组件的值进行双向绑定,这样在后台修改 StringVar 的值时,界面上对应的组件也会同步更新,反之亦然。
1.1 StringVar 的常见用法
-
初始化 StringVar: 使用 StringVar() 创建一个字符串变量。
-
设置值: 使用 set() 方法给 StringVar 赋值。
-
获取值: 使用 get() 方法获取 StringVar 当前的值。
-
与 Tkinter 组件绑定: 通过 textvariable 参数将 StringVar 绑定到 Tkinter 组件(如 Entry、Label),当 StringVar 的值改变时,组件的内容会自动更新。
2、BooleanVar
BooleanVar是 Tkinter 提供的一个变量类,用于处理布尔类型的数据(即 True 或 False)。它与 StringVar 类似,通常用于和 Checkbutton 组件绑定,以追踪和更新复选框的选中状态。
通过 BooleanVar,可以将布尔值绑定到 Tkinter 组件,使得界面和后台的布尔值可以自动同步更新。
2.1 BooleanVar 的常见用法
- 初始化 BooleanVar:使用 BooleanVar() 创建一个布尔变量。
- 设置值:使用 set(True) 或 set(False) 方法设置布尔值。
- 获取值:使用 get() 方法获取当前的布尔值。
- 与 Checkbutton 组件绑定:通过 variable 参数将 BooleanVar 绑定到 Checkbutton 组件,当复选框的状态改变时,BooleanVar 的值会自动更新。
3、frame布局
3.1 frame.place
son_frame = Frame(parent_frame) # 在 'parent_frame' 中创建一个 Frame 小部件
son_frame.place(relx=0.5, rely=0.0, x=-10, y=0) # 使用 place() 将 son_frame 放置在指定位置
- place() 方法允许通过相对坐标和绝对坐标来放置小部件。
- relx=0.5:表示相对于父框架水平位置的50%处(即水平居中)。
- rely=0.0:表示相对于父框架垂直位置的0%处(即顶部)。
- x=-10:在相对位置基础上,向左移动10个像素。
- y=0:垂直方向上没有额外的偏移。
这段代码会将 son_frame 放置在 parent_frame 的水平中心位置,稍微向左偏移10个像素,并且在顶部对齐。
3.2 sticky
sticky 是 grid() 的一个选项,用于指定小部件在单元格内的对齐方式。
sticky 的取值可以是 “n”, “s”, “e”, “w”(代表北、南、东、西四个方向),或者它们的组合。比如:
- sticky=“n”:表示顶部对齐(北)。
- sticky=“e”:表示右对齐(东)。
- sticky=“w”:表示左对齐(西)。
- sticky=“s”:表示底部对齐(南)。
- sticky=“nsew”:表示小部件填满整个单元格,并向四个方向拉伸。
4、textvariable
textvariable 是 Entry, Label, Button 等小部件的一个选项,用来将它们与一个 Tkinter 变量(如 StringVar)绑定。这样,可以动态更新小部件的内容或从小部件获取值。
4.1 textvariable 的使用场景:
获取输入框的值:通过绑定 Entry 小部件与 StringVar,你可以直接获取或设置输入框的值。
动态更新标签或按钮的文字:通过改变 StringVar 的值,可以动态更新小部件的显示内容。
4.2 使用 textvariable 的步骤:
- 创建一个 Tkinter 变量(例如 StringVar)。
- 将该变量与小部件的 textvariable 选项绑定。
- 修改或读取该变量的值
import tkinter as tkdef update_label():# 从 Entry 中获取值并更新 Labellabel_var.set(entry_var.get())root = tk.Tk()
root.geometry("300x200")# 创建 StringVar 变量
entry_var = tk.StringVar()
label_var = tk.StringVar()# 创建 Entry 并绑定 textvariable
entry = tk.Entry(root, textvariable=entry_var)
entry.pack(pady=10)# 创建 Label 并绑定 textvariable
label = tk.Label(root, textvariable=label_var, font=('Arial', 16))
label.pack(pady=10)# 创建按钮来更新 Label 的内容
button = tk.Button(root, text="更新标签", command=update_label)
button.pack(pady=10)root.mainloop()