如何在for循环中制作多个CTkButton具有不同的命令功能

问题描述 投票:0回答:1

我想在一个循环中创建多个具有相同功能但参数不同的 CTkButton。

这是我写的代码片段:


#Heres the gui_read function
def gui_read(row):
            for widget in main.winfo_children():
                widget.destroy()

            entry_frame = CTkTextbox(main, font = ('georgia', 17), corner_radius = 0, width = 650, height = 500, fg_color = '#1E5994')
            entry_frame.place(x=0, y = 80)
            entry = row['entry'].split('\\n')
            entry_frame.insert('0.0', row['date']+'\n'+row['category']+'\n'+'\n'+'\n'.join(entry))
            entry_frame.configure(state = 'disabled')


with open('diary.csv', 'r') as db:
    reader = csv.DictReader(db)
    for i, row in enumerate(reader, start = 2):
        CTkLabel(frame, text = row['date'], font = ('roboto', 15)).grid(row = i, column = 1)
        CTkLabel(frame, text = row['category'], font = ('roboto', 15)).grid(row = i, column = 2, padx = 60)
        CTkButton(frame, text = 'Read', width = 100, height = 15, font = ('roboto', 15), command = lambda : gui_read(row)).grid(row = i, column = 3)

这个示例展示了 diary.csv 的样子:

date,category,entry

13-09-2024,'special','hello diary,'

导入包括customtkinter和csv

在此代码片段中,gui_read 函数接收一行并将其显示在屏幕上。 问题是我希望所有按钮都显示自己的行,但所有按钮都显示循环中迭代的最后一个按钮,这是有道理的。

请提供一些代码来帮助我如何完成此任务。

python loops customtkinter
1个回答
0
投票

在 For 循环中使用不同的命令功能创建多个 CTkButtons

要在 for 循环中使用不同的命令函数创建多个 CTkButton,您可以使用 lambda 函数为每个按钮生成唯一的命令。这是基于 CustomTkinter 的个人经验的解决方案:

import customtkinter as ctk

def create_buttons(root, num_buttons):
    def create_command(i):
        return lambda: print(f"Button {i} clicked")

    for i in range(num_buttons):
        button = ctk.CTkButton(root, text=f"Button {i}", command=create_command(i))
        button.pack(pady=5)

# Example usage
root = ctk.CTk()
root.geometry("300x400")
create_buttons(root, 5)
root.mainloop()

此解决方案的工作原理是:

  1. create_command
    函数内定义
    create_buttons
    函数。这将创建一个捕获
    i
    当前值的闭包。
  2. 使用 lambda 函数为每个按钮的命令返回一个新函数。
  3. 在循环中创建 CTkButton,为每个按钮分配一个唯一的命令。

这里的关键是使用闭包来捕获每个按钮的

i
的当前值。这可确保每个按钮的命令功能引用正确的按钮编号。

限制和假设:

  • 这假设您使用的是 CustomTkinter。对于标准 Tkinter,请将
    ctk.CTk()
    替换为
    tk.Tk()
    ,将
    ctk.CTkButton
    替换为
    tk.Button
  • 按钮垂直排列。您可能需要调整布局方法(例如网格)以适应不同的排列。

替代方法: 您还可以使用列表理解来创建按钮:

import customtkinter as ctk

def create_buttons(root, num_buttons):
    buttons = [ctk.CTkButton(root, text=f"Button {i}", command=lambda x=i: print(f"Button {x} clicked")) 
               for i in range(num_buttons)]
    for button in buttons:
        button.pack(pady=5)

# Example usage
root = ctk.CTk()
root.geometry("300x400")
create_buttons(root, 5)
root.mainloop()

此方法使用

lambda x=i: ...
创建一个默认参数来捕获
i
的当前值。它更简洁,但对于初学者来说可能不太可读。

请记住根据您的特定应用程序的需要调整窗口大小 (

geometry
) 和布局方法。

© www.soinside.com 2019 - 2024. All rights reserved.