list/dictionary 中的 tkinter 按钮无法按下
tkinter buttons in list/dictionary can't be pressed
我对编程还很陌生,我正在创建一个项目,其中需要将按钮放置在网格中,该网格由许多列和行生成。为此,我创建了 grid_creator 函数,当我使用它时,它会生成网格并创建所有按钮(这里我称它们为像素),但我无法点击它们。我已经测试了按钮的名称,它们都是不同的,并且其他元素也不同。
我为适应这个目的而修改的原始代码在这里A button_name:button_object dictionary (Tkinter)。
唯一奇怪的是,我在其他地方用同样的方法生成了一个按钮网格,列表pixel_button_command变量中的命令有这样的表现:
<function <lambda> at 0x000001F0EC133940>
虽然函数列表中的每条命令都是这种格式。
<function grid_creator.<locals>.<lambda> at 0x000001CAC19B83A0>
def grid_creator(frame, height, width):
pixel_name = []
pixel_button_command = []
pixel_colour = []
pixel_row = []
pixel_column = []
for column in range(height):
for row in range(width):
name = str(row)+str(column)
pixel_name.append(name)
colour = image.getpixel((row,column))
colour = rgba_to_hex(colour)
pixel_button_command.append(lambda: change_image_pixel(row, column))
pixel_colour.append(colour)
pixel_row.append(row)
pixel_column.append(column)
zip_list = zip(pixel_name, pixel_button_command, pixel_colour, pixel_row, pixel_column)
one_pixel_size = tk.PhotoImage(width=1, height=1)
pixel_dict = {}
for name, cmd, colour, row, column in zip_list:
print(cmd)
pixel = Button(frame, text="", image=one_pixel_size, width=20, height=20, compound="c")
pixel.config(bg = colour, fg = colour, command=cmd)
pixel.grid(padx=1, pady=1)
pixel.grid(row=row, column=column, sticky='nsew')
pixel_dict[name] = pixel
locals().update(pixel_dict)
我怀疑当我将命令添加到列表时存在某种格式问题导致它们不起作用,因为在某些测试中我断言在命令列表中有命令,但在按钮中当我打印 cmd 时,它显示为“none”。
这是因为图像 one_pixel_size
在 grid_creator()
完成后被垃圾回收。将 one_pixel_size
声明为全局:
def grid_creator(frame, height, width):
global one_pixel_size
...
您还需要应用@TheLizzard 评论中提到的修复程序。
我对编程还很陌生,我正在创建一个项目,其中需要将按钮放置在网格中,该网格由许多列和行生成。为此,我创建了 grid_creator 函数,当我使用它时,它会生成网格并创建所有按钮(这里我称它们为像素),但我无法点击它们。我已经测试了按钮的名称,它们都是不同的,并且其他元素也不同。
我为适应这个目的而修改的原始代码在这里A button_name:button_object dictionary (Tkinter)。
唯一奇怪的是,我在其他地方用同样的方法生成了一个按钮网格,列表pixel_button_command变量中的命令有这样的表现:
<function <lambda> at 0x000001F0EC133940>
虽然函数列表中的每条命令都是这种格式。
<function grid_creator.<locals>.<lambda> at 0x000001CAC19B83A0>
def grid_creator(frame, height, width):
pixel_name = []
pixel_button_command = []
pixel_colour = []
pixel_row = []
pixel_column = []
for column in range(height):
for row in range(width):
name = str(row)+str(column)
pixel_name.append(name)
colour = image.getpixel((row,column))
colour = rgba_to_hex(colour)
pixel_button_command.append(lambda: change_image_pixel(row, column))
pixel_colour.append(colour)
pixel_row.append(row)
pixel_column.append(column)
zip_list = zip(pixel_name, pixel_button_command, pixel_colour, pixel_row, pixel_column)
one_pixel_size = tk.PhotoImage(width=1, height=1)
pixel_dict = {}
for name, cmd, colour, row, column in zip_list:
print(cmd)
pixel = Button(frame, text="", image=one_pixel_size, width=20, height=20, compound="c")
pixel.config(bg = colour, fg = colour, command=cmd)
pixel.grid(padx=1, pady=1)
pixel.grid(row=row, column=column, sticky='nsew')
pixel_dict[name] = pixel
locals().update(pixel_dict)
我怀疑当我将命令添加到列表时存在某种格式问题导致它们不起作用,因为在某些测试中我断言在命令列表中有命令,但在按钮中当我打印 cmd 时,它显示为“none”。
这是因为图像 one_pixel_size
在 grid_creator()
完成后被垃圾回收。将 one_pixel_size
声明为全局:
def grid_creator(frame, height, width):
global one_pixel_size
...
您还需要应用@TheLizzard 评论中提到的修复程序。