常用的尺寸参数设置、布局方法在之前的博客中均有提及,所以本文重点在于组件的创建与使用。
目录
1.子窗口(Toplevel
):
Tk
是主窗口,所有其他组件都放置在这个窗口中,在Day2的时候进行了详细介绍。Toplevel
是主窗口的一个子窗口,可以用于创建弹出窗口或对话框。
1.1 参数详解
- master:指定
Toplevel
窗口的主窗口。默认情况下,如果没有指定,Toplevel
将成为根窗口(root window)。 - class_:指定窗口的类名。
- width:窗口的宽度。
- height:窗口的高度。
- resizable:一个布尔值,指定窗口是否可以调整大小。
- topmost:一个布尔值,指定窗口是否总是位于其他窗口之上。
- overrideredirect:一个布尔值,指定窗口是否有一个标题栏。
- protocol:指定窗口应调用哪个协议来处理窗口关闭事件。
- title:窗口的标题。
- background:窗口的背景颜色。
- borderwidth:窗口边框的宽度。
- relief:窗口边框的样式。
- padx 和 pady:窗口内边距。
1.2 案例
import tkinter as tk
from Day2 import *
def toplexel_example(root):
def open_dialog():
dialog = tk.Toplevel(root)
dialog.title("弹出窗口")
dialog.geometry("200x100")
label = tk.Label(dialog, text="这是一个弹出窗口!")
label.pack(pady=20)
button = tk.Button(root, text="打开弹出窗口", command=open_dialog)
button.pack(pady=20)
if __name__=="__main__":
root = tk.Tk()
window_width = 400
window_height = 300
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='lightBlue') # 设置窗口背景颜色为浅蓝色
toplexel_example(root)
root.mainloop()
1.3 结果
2. 标签 (Label
):
在 Tkinter 库中,Label
控件用于显示文本和图像。
2.1 参数详解
- text:要显示的文本内容。
- image:要显示的图像。
- width:标签的宽度,以字符为单位。
- height:标签的高度,以行数为单位。
- bg:背景颜色。
- fg:前景颜色(通常是文本颜色)。
- font:文本的字体样式。
- anchor:文本在标签中的对齐方式。
2.2 案例
from PIL import Image, ImageTk
def label_example(root):
# 文字
label = tk.Label(root, text="Hello, World!", bg="yellow", fg="red", font=("Arial", 16), anchor="center")
label.pack(pady=20)
# 图片
img = Image.open(r"图片\transformer.png")
img = ImageTk.PhotoImage(img)
label = tk.Label(root, image=img)
label.image = img # 保持引用,防止垃圾回收
label.pack()
2.3 结果
3. 按钮 (Button
):
用户可以单击的按钮,通常用于触发事件或执行操作。
3.1 参数详解
-
text (字符串): 按钮上显示的文本
-
command (函数): 当按钮被点击时调用的函数
-
padx (整数或元组): 按钮左右两侧的内边距
-
pady (整数或元组): 按钮上下两侧的内边距。
-
bg (颜色): 按钮的背景颜色
-
fg (颜色): 按钮上文本的颜色
-
font (字体): 按钮上文本的字体
-
width (整数): 按钮的宽度,以字符为单位
-
height (整数): 按钮的高度,以行数为单位
-
relief (字符串): 按钮的外观,可以是
sunken
、raised
、solid
、dashed
、ridge
或groove
-
overrelief (字符串): 按钮在被鼠标悬停时的外观
-
activebackground (颜色): 按钮在被点击时的背景颜色
-
activeforeground (颜色): 按钮在被点击时的文本颜色
-
cursor (字符串): 当鼠标悬停在按钮上时,鼠标的形状
3.2 案例
def button_example(root):
def on_button_click():
print("按钮被点击了!")
# 创建一个按钮,并应用一些参数
button = tk.Button(root, text="点击我",
command=on_button_click,
padx=20,
pady=10,
bg="blue",
fg="white",
font=("Arial", 16),
relief="solid",
overrelief="sunken",
activebackground="green",
activeforeground="black",
cursor="hand2")
button.pack(pady=20)
3.3 结果
4. 文本框 (Entry
):
在Tkinter中,Entry
组件用于创建单行文本输入框,允许用户输入或显示文本。
4.1 参数详解
-
master (Tkinter widget): 父级窗口或组件,
Entry
将在其内部显示。 -
width (整数): 输入框的宽度,以字符为单位。
-
bg (颜色): 输入框的背景颜色。
-
fg (颜色): 输入框中文本的前景色(即文本颜色)。
-
font (字体): 输入框中文本的字体样式。
-
bd (整数): 输入框的边框宽度。
-
relief (字符串): 输入框的边框样式,如
sunken
,raised
,flat
,ridge
,solid
, 或groove
。 -
justify (字符串): 文本的对齐方式,可以是
left
,center
, 或right
。 -
textvariable (Tkinter StringVar): 将输入框的文本与一个
StringVar
对象绑定,允许从外部获取或设置文本。 -
show (字符串): 用于密码输入字段,将输入的字符显示为指定的符号。
-
state (字符串): 控制组件的状态,可以是
normal
,disabled
, 或readonly
。 -
disabledbackground (颜色): 当组件处于禁用状态时的背景颜色。
-
disabledforeground (颜色): 当组件处于禁用状态时的前景颜色。
4.2 案例
def entry_example(root):
# 假设的登录信息
correct_id = "962464"
correct_password = "123456"
def login():
# 获取输入框中的内容
user_id = id_entry.get()
user_password = password_entry.get()
# 检查用户输入的ID和密码是否正确
if user_id == correct_id and user_password == correct_password:
messagebox.showinfo("登录成功", "登录成功!")
else:
messagebox.showerror("登录失败", "登录失败,请检查您的用户名和密码。")
# 创建ID标签和输入框
id_label = tk.Label(root, text=" 账户:")
id_label.grid(row=0, column=0, padx=10, pady=10)
id_entry = tk.Entry(root, width=20)
id_entry.insert(0, "962464") # 初始化ID
id_entry.grid(row=0, column=1, padx=10, pady=10)
# 创建密码标签和输入框
password_label = tk.Label(root, text="密码:")
password_label.grid(row=1, column=0, padx=10, pady=10)
password_entry = tk.Entry(root, width=20, show="*") # 密码输入框显示星号
password_entry.grid(row=1, column=1, padx=10, pady=10)
# 创建登录按钮
login_button = tk.Button(root, text="登录", command=login)
login_button.grid(row=2, column=1, pady=10)
4.3 结果
5. 文本区域 (Text
):
用户可以输入多行文本的区域,通常用于显示较长的文本或允许用户输入多行文本。
5.1 参数详解
height
: 设置Text
组件的高度,以行数为单位。width
: 设置Text
组件的宽度,以字符数为单位。yscrollcommand
: 这个参数用于设置垂直滚动条的命令,当文本超过指定的高度时,滚动条会自动出现。xscrollcommand
: 类似于yscrollcommand
,用于设置水平滚动条的命令。insertofftime
: 当插入文本时,延迟多少毫秒后才更新显示,可以用来优化性能。undo
: 设置是否支持撤销功能,默认为False
,可以设置为True
启用撤销功能。
5.2 案例
def text_example(root):
def insert_text():
text_area.insert(tk.END, "这是一个新文本\n")
text_area = tk.Text(root, height=5, width=20)
text_area.grid(row=0, column=0, sticky="nsew")
scrollbar = tk.Scrollbar(root, command=text_area.yview)
scrollbar.grid(row=0, column=1, sticky="ns")
text_area.config(yscrollcommand=scrollbar.set)
button = tk.Button(root, text="插入文本", command=insert_text)
button.grid(row=1, column=0, columnspan=2, sticky="ew")
# 配置行列权重,确保文本框和滚动条可以扩展
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
5.3 结果
6. 列表框 (Listbox
):
用户可以从中选择一个或多个项目的列表。
6.1 参数详解
height
:指定Listbox
组件的高度,单位为行数width
:指定Listbox
组件的宽度,单位为字符数selectmode
:指定选择模式,可以是'single'
(单选)、'multiple'
(多选)或'extended'
(扩展选择)bg
:背景颜色fg
:前景颜色(通常是文本颜色)font
:字体设置yscrollcommand
:与滚动条组件关联,用于垂直滚动xscrollcommand
:与水平滚动条组件关联,用于水平滚动listvariable
:绑定到一个变量上,用于存储选中的列表项insert
:向列表中添加项目。
6.2 案例
def listbox_example(root):
def select_item(event):
# 使用event参数来获取选中的项
index = event.widget.curselection()[0]
selected_item = event.widget.get(index)
# 更新文本框的内容
text_box.delete(1.0, tk.END)
text_box.insert(tk.END, selected_item)
# 创建Listbox
listbox = tk.Listbox(root, selectmode='single', bg='light blue', fg='black', font=('Helvetica', 10))
listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# 创建滚动条
scrollbar = tk.Scrollbar(root, orient=tk.VERTICAL, command=listbox.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# 绑定滚动条
listbox.config(yscrollcommand=scrollbar.set)
# 添加项目到Listbox
items = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 'Item 6', 'Item 7', 'Item 8', 'Item 9', 'Item 10']
for item in items:
listbox.insert('end', item)
# 创建文本框
text_box = tk.Text(root, height=2, width=20, bg='white', fg='black', font=('Helvetica', 10))
text_box.pack(side=tk.LEFT, fill=tk.Y, expand=False)
# 绑定事件到Listbox组件
listbox.bind('<<ListboxSelect>>', select_item)
6.3 结果
7. 滚动条 (Scrollbar
):
在Tkinter中,Scrollbar
组件用于与Listbox
、Text
、Canvas
等组件一起使用,提供垂直或水平滚动功能。Scrollbar
组件的参数可以帮助你定制其外观和行为。
7.1 参数详解
orient
:VERTICAL
:创建一个垂直滚动条。HORIZONTAL
:创建一个水平滚动条。
command
:指定一个回调函数,该函数在滚动条移动时被调用。通常与目标组件的yview
或xview
方法一起使用。troughcolor
:设置滚动条槽的颜色。relief
:设置滚动条的边框样式,如sunken
、raised
、solid
等。width
:设置滚动条按钮的宽度。height
:设置滚动条按钮的高度。bg
:设置滚动条的背景颜色。bd
:设置滚动条的边框宽度。relief
:设置滚动条的边框样式。
7.2 案例
def Scrollbar_example(root):
def on_xscroll(event):
canvas.xview_scroll(-int(event.delta/120), 'units')
# 创建一个Canvas,并设置其宽度和高度
canvas_width = 600
canvas_height = 100
canvas = tk.Canvas(root, width=canvas_width, height=canvas_height, bg='white')
# 定义正弦曲线的参数
amplitude = 40 # 波幅
period = 100 # 周期
phase_shift = 0 # 相位移动
x_scale = 0.1 # 横坐标缩放
# 在Canvas上创建正弦曲线
points = []
for i in range(0, canvas_width, 2):
x = i / x_scale
y = amplitude * math.sin((x / period) + phase_shift)
y = canvas_height / 2 - y # 将y坐标移动到Canvas中心
points.append((i, y))
# 绘制正弦曲线
canvas.create_line(points, fill='blue')
# 将Canvas的内容超出部分设置为可滚动
canvas.config(scrollregion=(0, 0, canvas_width, canvas_height))
# 创建一个Scrollbar,并与Canvas关联
scrollbar = tk.Scrollbar(root, orient="horizontal", command=canvas.xview)
scrollbar.pack(side="bottom", fill="x")
# 将Scrollbar的滚动事件与Canvas的滚动方法关联
canvas.config(xscrollcommand=scrollbar.set)
canvas.bind('<MouseWheel>', on_xscroll)
# 将Canvas放置到窗口中
canvas.pack(side="left", fill="both", expand=True)
7.3 结果
8. 检查框 (Checkbutton
):
在Tkinter库中,Checkbutton
是一个用于创建复选框的控件。用户可以通过点击复选框来选中或取消选中它。
8.1 参数详解
- text:这是复选框旁边显示的文本。这是必须的参数。
- variable:与复选框状态关联的变量。当复选框被选中时,该变量的值变为
1
;取消选中时为0
。通常与IntVar
或StringVar
一起使用。 - onvalue:当复选框被选中时,
variable
的值应该被设置为此参数的值。 - offvalue:当复选框未被选中时,
variable
的值应该被设置为此参数的值。 - command:当复选框的状态改变时,将调用的函数。它接受一个参数,即复选框的当前状态(选中或未选中)。
- state:复选框的初始状态。可以是
NORMAL
(默认)、SELECTED
或UNSELECTED
。 - justify:文本对齐方式。可以是
LEFT
、CENTER
或RIGHT
。 - width:文本的宽度。
- height:文本的高度。
8.2 案例
def checkbutton_example(root):
def update_display(*args):
selected_items = [f"Item {i+1}" for i, var in enumerate(var_list) if var.get()]
display_text.delete(1.0, tk.END)
display_text.insert(tk.END, '\n'.join(selected_items))
# 创建Checkbutton列表
var_list = []
labels = ["Item 01", "Item 02", "Item 03", "Item 04", "Item 05", "Item 06", "Item 07", "Item 08", "Item 09", "Item 10"]
for i, label in enumerate(labels):
var = tk.BooleanVar()
checkbutton = tk.Checkbutton(root, text=label, variable=var)
checkbutton.grid(row=i, column=0, sticky='w', padx=5) # 左对齐,添加内边距
var_list.append(var)
# 创建一个文本框用于显示选中的标签
display_text = tk.Text(root)
display_text.grid(row=0, column=1, rowspan=11,sticky='nsew')
# 使用trace方法追踪变量的变化
for var in var_list:
var.trace('w', update_display)
8.3 结果
9. 复选框 (Radiobutton
):
在Python的Tkinter库中,Radiobutton
是一个用于创建单选按钮的组件。单选按钮允许用户在一组选项中选择一个,并且只能选择一个。
9.1 参数详解
text
: 指定单选按钮的文本内容。variable
: 指定一个关联的变量,用于存储用户选择的选项。value
: 指定单选按钮对应的值,这个值与variable
的值关联,当用户选择这个单选按钮时,variable
的值将被设置为这个值。command
: 可选参数,指定当单选按钮被选中时执行的函数。indicatoron
: 可选参数,一个布尔值,如果为True
,则显示指示器;如果为False
,则不显示指示器(默认为True
)。variable
: 指定关联的变量,如果未指定,则使用默认的全局变量tk.IntVar()
或tk.BooleanVar()
。width
: 可选参数,指定单选按钮文本的宽度。padx
和pady
: 可选参数,分别指定按钮文本前后的水平和垂直填充。
9.2 案例
def radiobutton_example(root):
def display_choice():
# 获取用户选择的选项
choice = var.get()
# 显示所选选项
result_label.config(text="您选择了: " + choice)
# 创建一个关联的变量
var = tk.StringVar()
var.set("Option 1")
# 创建三个单选按钮
r1 = tk.Radiobutton(root, text="选项1", variable=var, value="Option 1", command=display_choice)
r2 = tk.Radiobutton(root, text="选项2", variable=var, value="Option 2", command=display_choice)
r3 = tk.Radiobutton(root, text="选项3", variable=var, value="Option 3", command=display_choice)
# 将单选按钮放置在窗口中
r1.pack()
r2.pack()
r3.pack()
# 显示所选选项的标签
result_label = tk.Label(root, text="",width=20)
result_label.pack()
9.3 结果
10. 下拉列表 (OptionMenu
):
在Tkinter中,OptionMenu
控件允许用户从下拉列表中选择一个选项。
10.1 参数详解
master
:OptionMenu
控件所依赖的主窗口或框架。variable
: 一个tkinter.StringVar
类型的变量,用于存储当前选中的选项值。options
: 一个包含所有选项的列表或元组。command
: 当用户选择一个选项时调用的函数。这个函数可以有一个参数,它将是用户选择的选项值。
10.2 案例
def optionmenu_example(root):
def update_label(*args):
# 更新标签显示当前选中的选项
label.config(text="当前选择: " + selected_option.get())
# 创建一个StringVar对象,用于存储OptionMenu的当前选项
selected_option = tk.StringVar(root)
# 设置StringVar的初始值,这里设置为options列表中的第一个元素
selected_option.set("选项1")
# 创建一个OptionMenu,其中包含三个选项
option_menu = tk.OptionMenu(root, selected_option, "选项1", "选项2", "选项3", command=update_label)
option_menu.pack()
# 创建一个标签,用于显示当前选中的选项
label = tk.Label(root, text="",width=20)
label.pack()
10.3 结果
11. 标签框 (LabelFrame
):
在Tkinter中,LabelFrame
是一个容器控件,它允许开发者创建一个带有标题的框架,通常用于组织相关的控件。
11.1 参数详解
master
: 创建LabelFrame
的父窗口或容器。text
:LabelFrame
的标题文本,显示在框架的顶部。padx
: 标题和控件之间的水平填充。pady
: 标题和控件之间的垂直填充。borderwidth
: 标题边框的宽度。relief
: 标题边框的样式,可以是sunken
,raised
,solid
,dashed
,ridge
,groove
等。class_
: 指定LabelFrame
的样式类,用于CSS样式。
11.2 案例
def labelframe_example(root):
def submit_success():
# 这个函数会在按钮被点击后运行,显示一个消息框
messagebox.showinfo("提交成功", "您的信息已成功提交!")
# 创建一个LabelFrame,带有标题"个人信息"
personal_info_frame = tk.LabelFrame(root, text="个人信息", padx=10, pady=10)
personal_info_frame.pack(padx=20, pady=20, fill='both', expand=True)
# 在LabelFrame内创建一个Label
name_label = tk.Label(personal_info_frame, text="姓名:")
name_label.pack()
# 在LabelFrame内创建一个Entry控件
name_entry = tk.Entry(personal_info_frame)
name_entry.pack()
# 在LabelFrame内创建一个Button控件
submit_button = tk.Button(personal_info_frame, text="提交", command=submit_success)
submit_button.pack()
11.3 结果
12. 图像(ImageTk.PhotoImage)
ImageTk.PhotoImage
是Tkinter中用于将PIL(Python Imaging Library,现在称为Pillow)的图像对象转换为Tkinter可以使用的图像对象的一个类。
12.1参数详解
image
: PIL图像对象,通常通过PIL.Image.open()
或其他PIL方法创建。master
: Tkinter窗口或Tkinter组件的实例,通常为Tkinter顶级窗口。width
: 图像的宽度,如果没有提供,则默认为图像的实际宽度。height
: 图像的高度,如果没有提供,则默认为图像的实际高度。format
: 图像格式,例如'gif'、'png'等。
12.2 案例
def gif_example(root):
label = tk.Label(root)
label.pack()
# 确保路径正确,并且文件存在
image_path = "图片\\checkbutton.gif"
try:
image = Image.open(image_path)
except IOError:
print(f"无法加载图像文件:{image_path}")
return
photo = ImageTk.PhotoImage(image)
label.config(image=photo)
label.image = photo # 保存对photo对象的引用
def update_loading(i):
if i < image.n_frames: # 使用 image.n_frames 获取帧数
image.seek(i)
photo = ImageTk.PhotoImage(image)
label.config(image=photo)
label.image = photo # 保存对photo对象的引用
root.after(100, update_loading, i + 1)
else:
label.config(image=tk.PhotoImage()) # 清除图像
root.update_idletasks()
update_loading(0)
12.3 结果
窗口会加载这个gif
13. 图像按钮:
在Tkinter中,Button
组件可以用来创建图像按钮,即按钮上显示一个图像。
13.1 参数详解
- command: 当按钮被点击时调用的函数。
- compound: 指定图像和文本的相对位置。可以是
'left'
、'right'
、'top'
、'bottom'
或'center'
,默认为'top'
。 - image: 图像对象,通常是
ImageTk.PhotoImage
对象。 - text: 显示在按钮上的文本。
- font: 按钮上文本的字体。
- width: 文本宽度。
- height: 文本高度。
- relief: 按钮的外观,可以是
'sunken'
、'raised'
、'solid'
、'dashed'
、'flat'
或'groove'
。 - overrelief: 鼠标悬停时的外观。
- activebackground: 按钮被激活(按下)时的背景颜色。
- activeforeground: 按钮被激活时的文本颜色。
- background: 按钮的背景颜色。
- fg: 文本颜色。
- bd: 边框宽度。
- cursor: 鼠标悬停时的光标形状。
13.2 案例
def imagebutton_example(root):
def on_button_click():
messagebox.showinfo("测试成功!", "按钮被点击了!")
image_path = r"图片\button.png" # 确保路径正确,并且图像文件存在
try:
# 尝试打开图像文件
image = Image.open(image_path)
photo = ImageTk.PhotoImage(image)
# 创建图像按钮
button = tk.Button(root, image=photo, text="点击我", compound="bottom", command=on_button_click)
button.image = photo # 保持对 photo 的引用
button.pack()
except Exception as e:
messagebox.showerror("错误", f"无法加载图像:{e}")
13.3 结果
14. 进度条 (Progressbar
):
Progressbar
是一个用于显示进度的组件。
14.1 参数详解
-
orient
:控制进度条的显示方向,可以是horizontal
或vertical
。 -
mode
: 控制进度条的模式,可以是determinate
(确定性进度条,即进度是固定的)或indeterminate
(非确定性进度条,即进度是动态变化的,通常用于长时间的任务)。 -
maximum
: 设置进度条的最大值,即进度条的总长度。 -
value
: 设置当前进度的值,范围从 0 到maximum
。默认值为 0。 -
length
: 设置进度条的长度,通常与orient
参数一起使用。 -
style
: 用于设置进度条的样式,例如颜色、边框等。
14.2 案例
def progressbar_example(root):
# 更新进度条函数
def update_progress():
for i in range(101):
progress_bar['value'] = i
root.update_idletasks() # 更新GUI
root.update() # 更新窗口
root.after(100) # 每100ms更新一次
# 创建进度条
progress_bar = ttk.Progressbar(root, orient="horizontal", mode="determinate", maximum=100, length=300)
progress_bar.pack(pady=20)
# 开始进度条
progress_bar.start(100) # 设置进度条的更新频率为 100ms
# 创建一个按钮来控制进度条
button = tk.Button(root, text="Start Progress", command=update_progress)
button.pack()
14.3 结果
15. 菜单 (Menu
):
在 Tkinter 中,Menu
是用于创建菜单栏的组件,它可以包含多个菜单项(Menu
对象),这些菜单项可以进一步包含子菜单或者菜单项。
15.1 参数详解
tearoff=0/1
: 如果设置为1
,则菜单的最上面会有一个可以撕掉的标签,用于将菜单从菜单栏中分离出来。bg
: 菜单的背景颜色。fg
: 菜单文本的颜色。activebackground
: 当菜单项被激活时的背景颜色。activeforeground
: 当菜单项被激活时的文本颜色。font
: 菜单项的字体。postcommand
: 菜单打开后要执行的命令。relief
: 菜单项的边框样式,可以是sunken
、raised
、solid
、flat
等。
15.2 案例
def menu_example(root):
def open_file():
print("打开文件")
def save_file():
print("保存文件")
def exit_app():
root.destroy()
def cut_text():
print("剪切文本")
def copy_text():
print("复制文本")
def paste_text():
print("粘贴文本")
# 创建菜单栏
menu_bar = tk.Menu(root)
# 创建文件菜单
file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="打开", command=open_file)
file_menu.add_command(label="保存", command=save_file)
file_menu.add_separator() # 添加分隔线
file_menu.add_command(label="退出", command=exit_app)
# 创建编辑菜单
edit_menu = tk.Menu(menu_bar, tearoff=0)
edit_menu.add_command(label="剪切", command=cut_text)
edit_menu.add_command(label="复制", command=copy_text)
edit_menu.add_command(label="粘贴", command=paste_text)
# 将菜单添加到菜单栏
menu_bar.add_cascade(label="文件", menu=file_menu)
menu_bar.add_cascade(label="编辑", menu=edit_menu)
# 将菜单栏设置到窗口
root.config(menu=menu_bar)
15.3 结果
16. 框架 (Frame
):
在 Tkinter 中,Frame
是一个容器组件,用于组织其他组件。它本身不显示任何可见内容,但可以用来对窗口中的组件进行分组和布局。
16.1 参数详解
borderwidth
: 边框宽度,单位为像素。relief
: 边框样式,可以是sunken
、raised
、solid
、flat
等。width
: 宽度,可以是像素值或相对值。height
: 高度,可以是像素值或相对值。bd
: 与borderwidth
参数相同。bg
: 背景颜色。bd
: 与borderwidth
参数相同。class_
: 为 Frame 设置样式类。cursor
: 鼠标悬停时的光标类型。highlightbackground
: 高亮背景颜色。highlightcolor
: 高亮颜色。highlightthickness
: 高亮边框厚度。padx
和pady
: 在 Frame 的内部填充空间,用于调整内部组件的间距。
16.2 案例
def frame_example(root):
def on_button_click():
messagebox.showinfo("Frame 1", "按钮在Frame 1被点击了!")
def on_button_click_frame2():
messagebox.showinfo("Frame 2", "按钮在Frame 2被点击了!")
# 创建第一个Frame
frame1 = tk.Frame(root, bg='lightgray', padx=20, pady=20)
frame1.pack(padx=20, pady=10, fill='both', expand=True)
# 在Frame 1中添加一个按钮
button_frame1 = tk.Button(frame1, text="点击我(Frame 1)", command=on_button_click)
button_frame1.pack(pady=10)
# 创建第二个Frame
frame2 = tk.Frame(root, bg='blue', padx=20, pady=20)
frame2.pack(padx=20, pady=10, fill='both', expand=True)
# 在Frame 2中添加一个按钮
button_frame2 = tk.Button(frame2, text="点击我(Frame 2)", command=on_button_click_frame2)
button_frame2.pack(pady=10)
16.3 结果
17. 对话框 (Dialog
):
Tkinter 提供了几个用于创建模态对话框(Dialogs)的模块,例如 messagebox
、simpledialog
和 filedialog
。
17.1 messagebox
messagebox
模块用于显示简单的信息对话框,如消息框、询问框、错误框等。
17.1.1 参数详解
message
: 要显示的消息字符串。title
: 对话框的标题。icon
: 显示的图标(如 'info', 'question', 'error', 'warning')。type
: 消息框类型,可以是 'ok', 'yes_no', 'yes_no_cancel', 'retry_cancel' 等。
17.1.2 案例
def messagebox_example(root):
# 显示一个信息框
messagebox.showinfo("信息", "这是一条信息")
# 显示一个询问框
if messagebox.askquestion("询问", "你确定要退出吗?") == 'yes':
print("用户点击了 'Yes'")
else:
print("用户点击了 'No'")
# 显示一个确认对话框,用户必须点击 'OK' 或 'Cancel'
response = messagebox.askokcancel("确认", "你确定要删除这些文件吗?")
if response:
print("用户点击了 'OK'")
else:
print("用户点击了 'Cancel'")
# 显示一个错误框
messagebox.showerror("错误", "发生了一个错误!")
# 显示一个警告框
messagebox.showwarning("警告", "你正在尝试访问一个受限的区域!")
17.1.3 结果
17.2 simpledialog
simpledialog
模块用于创建简单的输入对话框。
17.2.1 参数详解
parent
: 父窗口。title
: 对话框标题。prompt
: 输入框提示信息。default
: 输入框的默认值。
17.2.2 案例
def simpledialog_example(root):
# 创建一个文本框用于显示信息
text_area = tk.Text(root, height=10, width=50)
text_area.pack()
# 获取用户输入的字符串
name = simpledialog.askstring("输入", "请输入您的名字:")
if name is None:
text_area.insert(tk.END, "用户取消了名字输入\n")
else:
text_area.insert(tk.END, "您输入的名字是: {}\n".format(name))
# 获取用户输入的整数
age = simpledialog.askinteger("输入", "请输入您的年龄:", minvalue=0)
if age is None:
text_area.insert(tk.END, "用户取消了年龄输入\n")
else:
text_area.insert(tk.END, "您输入的年龄是: {}\n".format(age))
# 获取用户输入的浮点数
weight = simpledialog.askfloat("输入", "请输入您的体重(千克):")
if weight is None:
text_area.insert(tk.END, "用户取消了体重输入\n")
else:
text_area.insert(tk.END, "您输入的体重是: {}\n".format(weight))
17.2.3 结果
17.3 filedialog
filedialog
模块用于创建文件选择对话框。
17.3.1 参数详解
parent
: 父窗口。title
: 对话框标题。filetypes
: 文件类型过滤器,如filetypes=[("Text files", "*.txt"), ("All files", "*.*")]
。initialdir
: 初始目录。
17.3.2 案例
def filedialog_example(root):
def open_file():
# 打开文件选择对话框
file_path = filedialog.askopenfilename(
title="选择文件",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
# 显示所选文件的路径
result_label.config(text="已选择文件: " + file_path)
def save_file():
# 打开保存文件对话框
file_path = filedialog.asksaveasfilename(
title="保存文件",
defaultextension="txt",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
# 显示保存的文件路径
result_label.config(text="已保存文件: " + file_path)
def open_directory():
# 打开目录选择对话框
directory_path = filedialog.askdirectory()
if directory_path:
# 显示所选目录的路径
result_label.config(text="已选择目录: " + directory_path)
def exit_program():
# 退出程序
root.destroy()
# 创建一个标签用于显示结果
result_label = tk.Label(root, text="请执行一个操作")
result_label.pack(pady=10)
# 创建按钮,用于打开文件选择对话框
open_button = tk.Button(root, text="打开文件", command=open_file)
open_button.pack(pady=5)
# 创建按钮,用于保存文件
save_button = tk.Button(root, text="保存文件", command=save_file)
save_button.pack(pady=5)
# 创建按钮,用于打开目录选择对话框
directory_button = tk.Button(root, text="打开目录", command=open_directory)
directory_button.pack(pady=5)
# 创建按钮,用于退出程序
exit_button = tk.Button(root, text="退出程序", command=exit_program)
exit_button.pack(pady=5)
17.3.3 结果
18. 完整代码
import math
import tkinter as tk
from Day2 import *
from PIL import Image, ImageTk
from tkinter import simpledialog,messagebox,filedialog
from tkinter import ttk
def toplexel_example(root):
def open_dialog():
dialog = tk.Toplevel(root)
dialog.title("弹出窗口")
dialog.geometry("200x100")
label = tk.Label(dialog, text="这是一个弹出窗口!")
label.pack(pady=20)
button = tk.Button(root, text="打开弹出窗口", command=open_dialog)
button.pack(pady=20)
def label_example(root):
# 文字
label = tk.Label(root, text="Hello, World!", bg="yellow", fg="red", font=("Arial", 16), anchor="center")
label.pack(pady=20)
# 图片
img = Image.open(r"图片\transformer.png")
img = ImageTk.PhotoImage(img)
label = tk.Label(root, image=img)
label.image = img # 保持引用,防止垃圾回收
label.pack()
def button_example(root):
def on_button_click():
print("按钮被点击了!")
# 创建一个按钮,并应用一些参数
button = tk.Button(root, text="点击我",
command=on_button_click,
padx=20,
pady=10,
bg="blue",
fg="white",
font=("Arial", 16),
relief="solid",
overrelief="sunken",
activebackground="green",
activeforeground="black",
cursor="hand2")
button.pack(pady=20)
def entry_example(root):
# 假设的登录信息
correct_id = "962464"
correct_password = "123456"
def login():
# 获取输入框中的内容
user_id = id_entry.get()
user_password = password_entry.get()
# 检查用户输入的ID和密码是否正确
if user_id == correct_id and user_password == correct_password:
messagebox.showinfo("登录成功", "登录成功!")
else:
messagebox.showerror("登录失败", "登录失败,请检查您的用户名和密码。")
# 创建ID标签和输入框
id_label = tk.Label(root, text=" 账户:")
id_label.grid(row=0, column=0, padx=10, pady=10)
id_entry = tk.Entry(root, width=20)
id_entry.insert(0, "962464") # 初始化ID
id_entry.grid(row=0, column=1, padx=10, pady=10)
# 创建密码标签和输入框
password_label = tk.Label(root, text="密码:")
password_label.grid(row=1, column=0, padx=10, pady=10)
password_entry = tk.Entry(root, width=20, show="*") # 密码输入框显示星号
password_entry.grid(row=1, column=1, padx=10, pady=10)
# 创建登录按钮
login_button = tk.Button(root, text="登录", command=login)
login_button.grid(row=2, column=1, pady=10)
def text_example(root):
def insert_text():
text_area.insert(tk.END, "这是一个新文本\n")
text_area = tk.Text(root, height=5, width=20)
text_area.grid(row=0, column=0, sticky="nsew")
scrollbar = tk.Scrollbar(root, command=text_area.yview)
scrollbar.grid(row=0, column=1, sticky="ns")
text_area.config(yscrollcommand=scrollbar.set)
button = tk.Button(root, text="插入文本", command=insert_text)
button.grid(row=1, column=0, columnspan=2, sticky="ew")
# 配置行列权重,确保文本框和滚动条可以扩展
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
def listbox_example(root):
def select_item(event):
# 使用event参数来获取选中的项
index = event.widget.curselection()[0]
selected_item = event.widget.get(index)
# 更新文本框的内容
text_box.delete(1.0, tk.END)
text_box.insert(tk.END, selected_item)
# 创建Listbox
listbox = tk.Listbox(root, selectmode='single', bg='light blue', fg='black', font=('Helvetica', 10))
listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# 创建滚动条
scrollbar = tk.Scrollbar(root, orient=tk.VERTICAL, command=listbox.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# 绑定滚动条
listbox.config(yscrollcommand=scrollbar.set)
# 添加项目到Listbox
items = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 'Item 6', 'Item 7', 'Item 8', 'Item 9', 'Item 10']
for item in items:
listbox.insert('end', item)
# 创建文本框
text_box = tk.Text(root, height=2, width=20, bg='white', fg='black', font=('Helvetica', 10))
text_box.pack(side=tk.LEFT, fill=tk.Y, expand=False)
# 绑定事件到Listbox组件
listbox.bind('<<ListboxSelect>>', select_item)
def Scrollbar_example(root):
def on_xscroll(event):
canvas.xview_scroll(-int(event.delta/120), 'units')
# 创建一个Canvas,并设置其宽度和高度
canvas_width = 600
canvas_height = 100
canvas = tk.Canvas(root, width=canvas_width, height=canvas_height, bg='white')
# 定义正弦曲线的参数
amplitude = 40 # 波幅
period = 100 # 周期
phase_shift = 0 # 相位移动
x_scale = 0.1 # 横坐标缩放
# 在Canvas上创建正弦曲线
points = []
for i in range(0, canvas_width, 2):
x = i / x_scale
y = amplitude * math.sin((x / period) + phase_shift)
y = canvas_height / 2 - y # 将y坐标移动到Canvas中心
points.append((i, y))
# 绘制正弦曲线
canvas.create_line(points, fill='blue')
# 将Canvas的内容超出部分设置为可滚动
canvas.config(scrollregion=(0, 0, canvas_width, canvas_height))
# 创建一个Scrollbar,并与Canvas关联
scrollbar = tk.Scrollbar(root, orient="horizontal", command=canvas.xview)
scrollbar.pack(side="bottom", fill="x")
# 将Scrollbar的滚动事件与Canvas的滚动方法关联
canvas.config(xscrollcommand=scrollbar.set)
canvas.bind('<MouseWheel>', on_xscroll)
# 将Canvas放置到窗口中
canvas.pack(side="left", fill="both", expand=True)
def checkbutton_example(root):
def update_display(*args):
selected_items = [f"Item {i+1}" for i, var in enumerate(var_list) if var.get()]
display_text.delete(1.0, tk.END)
display_text.insert(tk.END, '\n'.join(selected_items))
# 创建Checkbutton列表
var_list = []
labels = ["Item 01", "Item 02", "Item 03", "Item 04", "Item 05", "Item 06", "Item 07", "Item 08", "Item 09", "Item 10"]
for i, label in enumerate(labels):
var = tk.BooleanVar()
checkbutton = tk.Checkbutton(root, text=label, variable=var)
checkbutton.grid(row=i, column=0, sticky='w', padx=5) # 左对齐,添加内边距
var_list.append(var)
# 创建一个文本框用于显示选中的标签
display_text = tk.Text(root)
display_text.grid(row=0, column=1, rowspan=11,sticky='nsew')
# 使用trace方法追踪变量的变化
for var in var_list:
var.trace('w', update_display)
def radiobutton_example(root):
def display_choice():
# 获取用户选择的选项
choice = var.get()
# 显示所选选项
result_label.config(text="您选择了: " + choice)
# 创建一个关联的变量
var = tk.StringVar()
var.set("Option 1")
# 创建三个单选按钮
r1 = tk.Radiobutton(root, text="选项1", variable=var, value="Option 1", command=display_choice)
r2 = tk.Radiobutton(root, text="选项2", variable=var, value="Option 2", command=display_choice)
r3 = tk.Radiobutton(root, text="选项3", variable=var, value="Option 3", command=display_choice)
# 将单选按钮放置在窗口中
r1.pack()
r2.pack()
r3.pack()
# 显示所选选项的标签
result_label = tk.Label(root, text="",width=20)
result_label.pack()
def optionmenu_example(root):
def update_label(*args):
# 更新标签显示当前选中的选项
label.config(text="当前选择: " + selected_option.get())
# 创建一个StringVar对象,用于存储OptionMenu的当前选项
selected_option = tk.StringVar(root)
# 设置StringVar的初始值,这里设置为options列表中的第一个元素
selected_option.set("选项1")
# 创建一个OptionMenu,其中包含三个选项
option_menu = tk.OptionMenu(root, selected_option, "选项1", "选项2", "选项3", command=update_label)
option_menu.pack()
# 创建一个标签,用于显示当前选中的选项
label = tk.Label(root, text="",width=20)
label.pack()
def labelframe_example(root):
def submit_success():
# 这个函数会在按钮被点击后运行,显示一个消息框
messagebox.showinfo("提交成功", "您的信息已成功提交!")
# 创建一个LabelFrame,带有标题"个人信息"
personal_info_frame = tk.LabelFrame(root, text="个人信息", padx=10, pady=10)
personal_info_frame.pack(padx=20, pady=20, fill='both', expand=True)
# 在LabelFrame内创建一个Label
name_label = tk.Label(personal_info_frame, text="姓名:")
name_label.pack()
# 在LabelFrame内创建一个Entry控件
name_entry = tk.Entry(personal_info_frame)
name_entry.pack()
# 在LabelFrame内创建一个Button控件
submit_button = tk.Button(personal_info_frame, text="提交", command=submit_success)
submit_button.pack()
def gif_example(root):
label = tk.Label(root)
label.pack()
# 确保路径正确,并且文件存在
image_path = "图片\\checkbutton.gif"
try:
image = Image.open(image_path)
except IOError:
print(f"无法加载图像文件:{image_path}")
return
photo = ImageTk.PhotoImage(image)
label.config(image=photo)
label.image = photo # 保存对photo对象的引用
def update_loading(i):
if i < image.n_frames: # 使用 image.n_frames 获取帧数
image.seek(i)
photo = ImageTk.PhotoImage(image)
label.config(image=photo)
label.image = photo # 保存对photo对象的引用
root.after(100, update_loading, i + 1)
else:
label.config(image=tk.PhotoImage()) # 清除图像
root.update_idletasks()
update_loading(0)
def imagebutton_example(root):
def on_button_click():
messagebox.showinfo("测试成功!", "按钮被点击了!")
image_path = r"图片\button.png" # 确保路径正确,并且图像文件存在
try:
# 尝试打开图像文件
image = Image.open(image_path)
photo = ImageTk.PhotoImage(image)
# 创建图像按钮
button = tk.Button(root, image=photo, text="点击我", compound="bottom", command=on_button_click)
button.image = photo # 保持对 photo 的引用
button.pack()
except Exception as e:
messagebox.showerror("错误", f"无法加载图像:{e}")
def progressbar_example(root):
# 更新进度条函数
def update_progress():
for i in range(101):
progress_bar['value'] = i
root.update_idletasks() # 更新GUI
root.update() # 更新窗口
root.after(100) # 每100ms更新一次
# 创建进度条
progress_bar = ttk.Progressbar(root, orient="horizontal", mode="determinate", maximum=100, length=300)
progress_bar.pack(pady=20)
# 开始进度条
progress_bar.start(100) # 设置进度条的更新频率为 100ms
# 创建一个按钮来控制进度条
button = tk.Button(root, text="Start Progress", command=update_progress)
button.pack()
def menu_example(root):
def open_file():
print("打开文件")
def save_file():
print("保存文件")
def exit_app():
root.destroy()
def cut_text():
print("剪切文本")
def copy_text():
print("复制文本")
def paste_text():
print("粘贴文本")
# 创建菜单栏
menu_bar = tk.Menu(root)
# 创建文件菜单
file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="打开", command=open_file)
file_menu.add_command(label="保存", command=save_file)
file_menu.add_separator() # 添加分隔线
file_menu.add_command(label="退出", command=exit_app)
# 创建编辑菜单
edit_menu = tk.Menu(menu_bar, tearoff=0)
edit_menu.add_command(label="剪切", command=cut_text)
edit_menu.add_command(label="复制", command=copy_text)
edit_menu.add_command(label="粘贴", command=paste_text)
# 将菜单添加到菜单栏
menu_bar.add_cascade(label="文件", menu=file_menu)
menu_bar.add_cascade(label="编辑", menu=edit_menu)
# 将菜单栏设置到窗口
root.config(menu=menu_bar)
def frame_example(root):
def on_button_click():
messagebox.showinfo("Frame 1", "按钮在Frame 1被点击了!")
def on_button_click_frame2():
messagebox.showinfo("Frame 2", "按钮在Frame 2被点击了!")
# 创建第一个Frame
frame1 = tk.Frame(root, bg='lightgray', padx=20, pady=20)
frame1.pack(padx=20, pady=10, fill='both', expand=True)
# 在Frame 1中添加一个按钮
button_frame1 = tk.Button(frame1, text="点击我(Frame 1)", command=on_button_click)
button_frame1.pack(pady=10)
# 创建第二个Frame
frame2 = tk.Frame(root, bg='blue', padx=20, pady=20)
frame2.pack(padx=20, pady=10, fill='both', expand=True)
# 在Frame 2中添加一个按钮
button_frame2 = tk.Button(frame2, text="点击我(Frame 2)", command=on_button_click_frame2)
button_frame2.pack(pady=10)
def messagebox_example(root):
# 显示一个信息框
messagebox.showinfo("信息", "这是一条信息")
# 显示一个询问框
if messagebox.askquestion("询问", "你确定要退出吗?") == 'yes':
print("用户点击了 'Yes'")
else:
print("用户点击了 'No'")
# 显示一个确认对话框,用户必须点击 'OK' 或 'Cancel'
response = messagebox.askokcancel("确认", "你确定要删除这些文件吗?")
if response:
print("用户点击了 'OK'")
else:
print("用户点击了 'Cancel'")
# 显示一个错误框
messagebox.showerror("错误", "发生了一个错误!")
# 显示一个警告框
messagebox.showwarning("警告", "你正在尝试访问一个受限的区域!")
def simpledialog_example(root):
# 创建一个文本框用于显示信息
text_area = tk.Text(root, height=10, width=50)
text_area.pack()
# 获取用户输入的字符串
name = simpledialog.askstring("输入", "请输入您的名字:")
if name is None:
text_area.insert(tk.END, "用户取消了名字输入\n")
else:
text_area.insert(tk.END, "您输入的名字是: {}\n".format(name))
# 获取用户输入的整数
age = simpledialog.askinteger("输入", "请输入您的年龄:", minvalue=0)
if age is None:
text_area.insert(tk.END, "用户取消了年龄输入\n")
else:
text_area.insert(tk.END, "您输入的年龄是: {}\n".format(age))
# 获取用户输入的浮点数
weight = simpledialog.askfloat("输入", "请输入您的体重(千克):")
if weight is None:
text_area.insert(tk.END, "用户取消了体重输入\n")
else:
text_area.insert(tk.END, "您输入的体重是: {}\n".format(weight))
def filedialog_example(root):
def open_file():
# 打开文件选择对话框
file_path = filedialog.askopenfilename(
title="选择文件",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
# 显示所选文件的路径
result_label.config(text="已选择文件: " + file_path)
def save_file():
# 打开保存文件对话框
file_path = filedialog.asksaveasfilename(
title="保存文件",
defaultextension="txt",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
# 显示保存的文件路径
result_label.config(text="已保存文件: " + file_path)
def open_directory():
# 打开目录选择对话框
directory_path = filedialog.askdirectory()
if directory_path:
# 显示所选目录的路径
result_label.config(text="已选择目录: " + directory_path)
def exit_program():
# 退出程序
root.destroy()
# 创建一个标签用于显示结果
result_label = tk.Label(root, text="请执行一个操作")
result_label.pack(pady=10)
# 创建按钮,用于打开文件选择对话框
open_button = tk.Button(root, text="打开文件", command=open_file)
open_button.pack(pady=5)
# 创建按钮,用于保存文件
save_button = tk.Button(root, text="保存文件", command=save_file)
save_button.pack(pady=5)
# 创建按钮,用于打开目录选择对话框
directory_button = tk.Button(root, text="打开目录", command=open_directory)
directory_button.pack(pady=5)
# 创建按钮,用于退出程序
exit_button = tk.Button(root, text="退出程序", command=exit_program)
exit_button.pack(pady=5)
if __name__=="__main__":
root = tk.Tk()
window_width = 400
window_height = 300
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='lightBlue') # 设置窗口背景颜色为红色
#toplexel_example(root)
#label_example(root)
#button_example(root)
#entry_example(root)
#text_example(root)
#listbox_example(root)
#Scrollbar_example(root)
#checkbutton_example(root)
#radiobutton_example(root)
#optionmenu_example(root)
#labelframe_example(root)
#gif_example(root)
#imagebutton_example(root)
#progressbar_example(root)
#menu_example(root)
#frame_example(root)
#messagebox_example(root)
#simpledialog_example(root)
filedialog_example(root)
root.mainloop()