当前位置: 首页> 教育> 幼教 > 10天速通Tkinter库——Day 3:组件详解

10天速通Tkinter库——Day 3:组件详解

时间:2025/7/25 12:00:17来源:https://blog.csdn.net/T940842933/article/details/141220013 浏览次数:0次

常用的尺寸参数设置、布局方法在之前的博客中均有提及,所以本文重点在于组件的创建与使用。

目录

1.子窗口(Toplevel):

1.1 参数详解

1.2 案例

1.3 结果

2. 标签 (Label):

2.1 参数详解

2.2 案例

2.3 结果

3. 按钮 (Button):

3.1 参数详解

3.2 案例

3.3 结果

4. 文本框 (Entry):

4.1 参数详解

4.2 案例

4.3 结果

5. 文本区域 (Text):

5.1 参数详解

5.2 案例

5.3 结果

6. 列表框 (Listbox):

6.1 参数详解

6.2 案例

6.3 结果

7. 滚动条 (Scrollbar):

7.1 参数详解

7.2 案例

7.3 结果

8. 检查框 (Checkbutton):

8.1 参数详解

8.2 案例

8.3 结果

9. 复选框 (Radiobutton):

9.1 参数详解

9.2 案例

9.3 结果

10. 下拉列表 (OptionMenu):

10.1 参数详解

10.2 案例

10.3 结果

11. 标签框 (LabelFrame):

11.1 参数详解

11.2 案例

11.3 结果

12. 图像(ImageTk.PhotoImage)

12.1参数详解

12.2 案例

12.3 结果

13. 图像按钮:

13.1 参数详解

13.2 案例

13.3 结果

14. 进度条 (Progressbar):

14.1 参数详解

14.2 案例

14.3 结果

15. 菜单 (Menu):

15.1 参数详解

15.2 案例

15.3 结果

16. 框架 (Frame):

16.1 参数详解

16.2 案例

16.3 结果

17. 对话框 (Dialog):

17.1 messagebox

17.1.1 参数详解

17.1.2 案例

17.1.3 结果

17.2 simpledialog

17.2.1 参数详解

17.2.2 案例

17.2.3 结果

17.3 filedialog

17.3.1 参数详解

17.3.2 案例

17.3.3 结果

18. 完整代码


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 = 400window_height = 300title_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 (字符串): 按钮的外观,可以是sunkenraisedsoliddashedridgegroove

  • 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 参数详解

  1. master (Tkinter widget): 父级窗口或组件,Entry 将在其内部显示。

  2. width (整数): 输入框的宽度,以字符为单位。

  3. bg (颜色): 输入框的背景颜色。

  4. fg (颜色): 输入框中文本的前景色(即文本颜色)。

  5. font (字体): 输入框中文本的字体样式。

  6. bd (整数): 输入框的边框宽度。

  7. relief (字符串): 输入框的边框样式,如sunkenraisedflatridgesolid, 或 groove

  8. justify (字符串): 文本的对齐方式,可以是leftcenter, 或 right

  9. textvariable (Tkinter StringVar): 将输入框的文本与一个StringVar对象绑定,允许从外部获取或设置文本。

  10. show (字符串): 用于密码输入字段,将输入的字符显示为指定的符号。

  11. state (字符串): 控制组件的状态,可以是normaldisabled, 或 readonly

  12. disabledbackground (颜色): 当组件处于禁用状态时的背景颜色。

  13. 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")  # 初始化IDid_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)# 创建Listboxlistbox = 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)# 添加项目到Listboxitems = ['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组件用于与ListboxTextCanvas等组件一起使用,提供垂直或水平滚动功能。Scrollbar组件的参数可以帮助你定制其外观和行为。

7.1 参数详解

  • orient
    • VERTICAL:创建一个垂直滚动条。
    • HORIZONTAL:创建一个水平滚动条。
  • command:指定一个回调函数,该函数在滚动条移动时被调用。通常与目标组件的yviewxview方法一起使用。
  • troughcolor:设置滚动条槽的颜色。
  • relief:设置滚动条的边框样式,如sunkenraisedsolid等。
  • 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 = 600canvas_height = 100canvas = 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_scaley = 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。通常与IntVarStringVar一起使用。
  • onvalue:当复选框被选中时,variable的值应该被设置为此参数的值。
  • offvalue:当复选框未被选中时,variable的值应该被设置为此参数的值。
  • command:当复选框的状态改变时,将调用的函数。它接受一个参数,即复选框的当前状态(选中或未选中)。
  • state:复选框的初始状态。可以是NORMAL(默认)、SELECTEDUNSELECTED
  • justify:文本对齐方式。可以是LEFTCENTERRIGHT
  • 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 参数详解

  • masterOptionMenu 控件所依赖的主窗口或框架。
  • 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 的父窗口或容器。
  • textLabelFrame 的标题文本,显示在框架的顶部。
  • padx: 标题和控件之间的水平填充。
  • pady: 标题和控件之间的垂直填充。
  • borderwidth: 标题边框的宽度。
  • relief: 标题边框的样式,可以是 sunkenraisedsoliddashedridgegroove 等。
  • 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内创建一个Labelname_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}")returnphoto = 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 参数详解

  1. orient:控制进度条的显示方向,可以是 horizontal 或 vertical

  2. mode: 控制进度条的模式,可以是 determinate(确定性进度条,即进度是固定的)或 indeterminate(非确定性进度条,即进度是动态变化的,通常用于长时间的任务)。

  3. maximum: 设置进度条的最大值,即进度条的总长度。

  4. value: 设置当前进度的值,范围从 0 到 maximum。默认值为 0。

  5. length: 设置进度条的长度,通常与 orient 参数一起使用。

  6. style: 用于设置进度条的样式,例如颜色、边框等。

14.2 案例

def progressbar_example(root):# 更新进度条函数def update_progress():for i in range(101):progress_bar['value'] = iroot.update_idletasks()  # 更新GUIroot.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: 菜单项的边框样式,可以是 sunkenraisedsolidflat 等。

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: 边框样式,可以是 sunkenraisedsolidflat 等。
  • 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被点击了!")# 创建第一个Frameframe1 = 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)# 创建第二个Frameframe2 = 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)的模块,例如 messageboxsimpledialog 和 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 ttkdef 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")  # 初始化IDid_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)# 创建Listboxlistbox = 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)# 添加项目到Listboxitems = ['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 = 600canvas_height = 100canvas = 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_scaley = 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内创建一个Labelname_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}")returnphoto = 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'] = iroot.update_idletasks()  # 更新GUIroot.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被点击了!")# 创建第一个Frameframe1 = 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)# 创建第二个Frameframe2 = 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 = 400window_height = 300title_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()
关键字:10天速通Tkinter库——Day 3:组件详解

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: