我想在一个循环中创建多个具有相同功能但参数不同的 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 函数接收一行并将其显示在屏幕上。 问题是我希望所有按钮都显示自己的行,但所有按钮都显示循环中迭代的最后一个按钮,这是有道理的。
请提供一些代码来帮助我如何完成此任务。
要在 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()
此解决方案的工作原理是:
create_command
函数内定义 create_buttons
函数。这将创建一个捕获 i
当前值的闭包。这里的关键是使用闭包来捕获每个按钮的
i
的当前值。这可确保每个按钮的命令功能引用正确的按钮编号。
限制和假设:
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
) 和布局方法。