文章目录
- 一、tkinter 简介
- 二、tkinter 基础(部件 + 布局管理器)
- 三、项目实战
- 3.1、主循环:root.mainloop()
- 3.2、手动摧毁窗口:root.destroy()
- 3.3、布局管理器:pack
- 3.4、布局管理器:grid
- 3.5、布局管理器:place
- 四、消息框:tkinter.messagebox
- 五、滚动文本:tkinter.scrolledtext
一、tkinter 简介
Tkinter 是 Python 标准库中的一个模块,用于创建图形用户界面 (GUI)。 它是最早的也是最常用的 GUI 工具包之一,因其易用性和直接与 Python 绑定而广受欢迎。
- 基于Tcl/Tk(Tk 是 Tcl 语言开发的跨平台 GUI 工具包)。Tkinter 提供了与 Tk 的接口,使得 Python 程序员能够创建 GUI 应用程序。
- 跨平台支持:支持在Windows、macOS和Linux上运行,且发行版一致。
- Tkinter 是 Python 标准库的一部分,无需额外安装。
二、tkinter 基础(部件 + 布局管理器)
- 根窗口(Root Window):是所有Tkinter应用程序的主窗口,通常由
Tk()类实例化
。它是其他所有窗口部件的父窗口。- 部件(Widgets):是指应用程序中的各种界面元素,是用户与应用程序交互的主要方式。
标签(Label)
:用于显示文本或图像的静态控件。标签常用于显示提示信息或标题。按钮(Button)
:用户可以点击按钮来触发某些动作。可以为按钮设置文本或图像,并指定点击时调用的回调函数。文本框(Entry)
:单行文本输入控件,用户可以在其中输入和编辑文本。文本控件(Text)
:多行文本输入控件,允许用户输入和编辑多行文本。它支持丰富的文本样式和颜色。列表框(Listbox)
:显示列表项的控件,用户可以从中选择一个或多个项目。复选框(Checkbutton)
:允许用户选择或取消选择的按钮。常用于表示布尔选项。单选按钮(Radiobutton)
:一组选项中只能选择一个的按钮。常用于从多个互斥的选项中选择一个。框架(Frame)
:用于组织其他部件的容器。框架可以嵌套,用于创建复杂的布局。画布(Canvas)
:强大的绘图区域,用于绘制图形、图像和其他复杂的自定义界面元素。- 布局管理器(Geometry Managers):负责组织和排列部件在窗口中的位置。Tkinter提供了几种布局管理器,每种管理器有不同的布局方式。
顺序-布局管理器 pack
:按照添加顺序将部件放置在窗口中。可以通过side参数指定部件排列的方向(如top、bottom、left、right)。网格-布局管理器 grid
:使用行和列来精确定位部件。可以通过row和column参数指定部件的位置。坐标-布局管理器 place
:使用x和y坐标来精确定位部件- 主循环 root.mainloop():(1)启动Tkinter的主事件循环,使应用程序保持运行并处理所有用户交互(如:鼠标点击、键盘输入等)和窗口更新。(2)没有它,窗口不会响应用户输入或显示任何内容。(3)当用户关闭窗口时,自动结束事件处理循环并关闭程序,而不需要显示调用 root.destroy()。
- 手动摧毁窗口 root.destroy():用于完全销毁 tkinter 主窗口。它不仅关闭窗口并终止应用程序的运行,包括停止所有与窗口相关的事件处理循环,并清理相关的资源(如:内存或文件句柄)。
三、项目实战
3.1、主循环:root.mainloop()
点击(右)确定,(右)界面摧毁,(左)界面不会摧毁。
import tkinter as tk
from tkinter import messagebox
def close_application():
messagebox.showinfo("Info", "Closing the application...")
if __name__ == '__main__':
root = tk.Tk() # 创建主窗口
root.title("Simple Tkinter App") # 设置主窗口标题
tk.Button(root, text="Click Me", command=close_application).pack(pady=20) # 添加一个按钮
root.mainloop() # 启动主循环
3.2、手动摧毁窗口:root.destroy()
点击(右)确定,(右)界面摧毁,(左)界面同时摧毁。
import tkinter as tk
from tkinter import messagebox
def close_application():
messagebox.showinfo("Info", "Closing the application...")
root.destroy() # 手动关闭窗口并退出程序
if __name__ == '__main__':
root = tk.Tk() # 创建主窗口
root.title("Simple Tkinter App") # 设置主窗口标题
tk.Button(root, text="Close", command=close_application).pack(pady=20) # 添加一个关闭按钮
root.mainloop() # 启动主循环
3.3、布局管理器:pack
import tkinter as tk
from tkinter import messagebox
def submit():
name = name_entry.get()
gender = gender_var.get()
subscribed = subscribe_var.get()
gender_text = "Male" if gender == 1 else "Female"
subscribed_text = "Yes" if subscribed == 1 else "No"
messagebox.showinfo("Information", f"Name: {name}\nGender: {gender_text}\nSubscribed: {subscribed_text}")
if __name__ == '__main__':
root = tk.Tk() # 创建主窗口
root.title("Simple Form with pack()") # 设置主窗口标题
# 创建部件并使用 pack 布局管理器
tk.Label(root, text="Name:").pack(anchor='w', padx=10, pady=5)
name_entry = tk.Entry(root)
name_entry.pack(padx=10, pady=5)
tk.Label(root, text="Gender:").pack(anchor='w', padx=10, pady=5)
gender_var = tk.IntVar()
tk.Radiobutton(root, text="Male", variable=gender_var, value=1).pack(anchor='w', padx=10, pady=2)
tk.Radiobutton(root, text="Female", variable=gender_var, value=2).pack(anchor='w', padx=10, pady=2)
subscribe_var = tk.IntVar()
tk.Checkbutton(root, text="Subscribe to newsletter", variable=subscribe_var).pack(anchor='w', padx=10, pady=5)
submit_button = tk.Button(root, text="Submit", command=submit)
submit_button.pack(pady=10)
root.mainloop() # 进入主循环
3.4、布局管理器:grid
import tkinter as tk
from tkinter import messagebox
def submit():
name = name_entry.get()
gender = gender_var.get()
subscribed = subscribe_var.get()
gender_text = "Male" if gender == 1 else "Female"
subscribed_text = "Yes" if subscribed == 1 else "No"
messagebox.showinfo("Information", f"Name: {name}\nGender: {gender_text}\nSubscribed: {subscribed_text}")
if __name__ == '__main__':
root = tk.Tk() # 创建主窗口
root.title("Simple Form") # 设置主窗口标题
# 创建部件并使用 grid 布局管理器
tk.Label(root, text="Name:").grid(row=0, column=0, padx=10, pady=5, sticky=tk.W)
name_entry = tk.Entry(root)
name_entry.grid(row=0, column=1, padx=10, pady=5)
tk.Label(root, text="Gender:").grid(row=1, column=0, padx=10, pady=5, sticky=tk.W)
gender_var = tk.IntVar()
tk.Radiobutton(root, text="Male", variable=gender_var, value=1).grid(row=1, column=1, padx=10, pady=5, sticky=tk.W)
tk.Radiobutton(root, text="Female", variable=gender_var, value=2).grid(row=1, column=2, padx=10, pady=5, sticky=tk.W)
subscribe_var = tk.IntVar()
tk.Checkbutton(root, text="Subscribe to newsletter", variable=subscribe_var).grid(row=2, columnspan=3, padx=10, pady=5)
submit_button = tk.Button(root, text="Submit", command=submit)
submit_button.grid(row=3, columnspan=3, pady=10)
root.mainloop() # 进入主循环
3.5、布局管理器:place
import tkinter as tk
from tkinter import messagebox
def submit():
name = name_entry.get()
gender = gender_var.get()
subscribed = subscribe_var.get()
gender_text = "Male" if gender == 1 else "Female"
subscribed_text = "Yes" if subscribed == 1 else "No"
messagebox.showinfo("Information", f"Name: {name}\nGender: {gender_text}\nSubscribed: {subscribed_text}")
if __name__ == '__main__':
root = tk.Tk() # 创建主窗口
root.title("Simple Form with place()") # 设置主窗口标题
# 创建部件并使用 place 布局管理器
tk.Label(root, text="Name:").place(x=20, y=20, anchor=tk.W)
name_entry = tk.Entry(root)
name_entry.place(x=80, y=20, width=200)
tk.Label(root, text="Gender:").place(x=20, y=60, anchor=tk.W)
gender_var = tk.IntVar()
tk.Radiobutton(root, text="Male", variable=gender_var, value=1).place(x=80, y=60, anchor=tk.W)
tk.Radiobutton(root, text="Female", variable=gender_var, value=2).place(x=140, y=60, anchor=tk.W)
subscribe_var = tk.IntVar()
tk.Checkbutton(root, text="Subscribe to newsletter", variable=subscribe_var).place(x=20, y=100, anchor=tk.W)
submit_button = tk.Button(root, text="Submit", command=submit)
submit_button.place(x=20, y=140)
root.geometry("300x200") # 设置窗口大小
root.mainloop() # 进入主循环
四、消息框:tkinter.messagebox
官网:tkinter.messagebox— Tkinter 消息提示
源码: Lib/tkinter/messagebox.py
tkinter.messagebox模块
:提供了多种弹出消息框的函数,用于在GUI应用程序中显示信息、警告、错误、提示用户进行确认等。消息框是模态的,将根据用户的选择返回 (True、False、OK、None、Yes、No) 的子集。
import tkinter as tk
from tkinter import messagebox
def show_message_boxes():
root = tk.Tk() # 创建主窗口
root.withdraw() # 隐藏主窗口
root.lift() # 提升窗口在最前面
root.attributes('-topmost', True) # 将窗口保持在最前面
# root.after(0, lambda: root.attributes('-topmost', False)) # 保证消息框显示后可以被其他窗口覆盖
messagebox.showinfo("信息", "这是一个信息消息框。")
messagebox.showwarning("警告", "这是一个警告消息框。")
messagebox.showerror("错误", "这是一个错误消息框。")
result = messagebox.askquestion("问题", "这是一个问题消息框。")
print(f"问题消息框:{result}")
result = messagebox.askretrycancel("重试或取消", "这是一个重试/取消消息框。")
print(f"重试/取消消息框:{result}")
result = messagebox.askokcancel("确认", "这是一个确认消息框。")
print(f"确认消息框:{result}")
result = messagebox.askyesno("问题", "这是一个是/否消息框。")
print(f"是否消息框:{result}")
result = messagebox.askyesnocancel("问题", "这是一个是/否/取消消息框。")
print(f"是/否/取消消息框:{result}")
root.destroy() # 用于销毁主窗口,从而退出程序。
if __name__ == '__main__':
show_message_boxes()
五、滚动文本:tkinter.scrolledtext
官网:tkinter.scrolledtext— 滚动文本小部件
源码: Lib/tkinter/scrolledtext.py
tkinter.scrolledtext.ScrolledText
:是 tkinter 库中的一个文本小部件,它带有一个内置的滚动条,使得可以方便地处理大量文本。这个组件可以用来创建带有垂直滚动条的文本输入或显示区域。
import tkinter as tk
from tkinter import scrolledtext
def main():
root = tk.Tk() # 创建主窗口
root.title("ScrolledText 示例") # 设置窗口标题
root.geometry("400x300") # 设置窗口大小
# 创建ScrolledText小部件
st = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=40, height=10, font=("Times New Roman", 12))
st.pack(padx=10, pady=10) # 将小部件放置在主窗口中,并设置外边距
# 在ScrolledText中插入初始文本
st.insert(tk.INSERT, "这是一个带滚动条的文本输入框。你可以在这里输入大量的文本内容,而不会超出显示区域。\n\n" \
"如果文本超出显示区域,会自动出现滚动条。")
# 启动主事件循环
root.mainloop()
if __name__ == "__main__":
main()