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

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

目录

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 = 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 (字符串): 按钮的外观,可以是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")  # 初始化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组件用于与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 = 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。通常与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内创建一个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 参数详解

  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'] = 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: 菜单项的边框样式,可以是 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被点击了!")

    # 创建第一个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)的模块,例如 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 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值