【问题标题】:tkinter buttons in list/dictionary can't be pressed无法按下列表/字典中的 tkinter 按钮
【发布时间】:2021-06-06 22:52:50
【问题描述】:

我对编程很陌生,我正在创建一个需要将按钮放置在网格中的项目,该网格由许多列和行生成。为此,我创建了 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”。

【问题讨论】:

  • command=lambda: change_image_pixel(row, column) 更改为command=lambda row=row, column=column: change_image_pixel(row, column)
  • 很抱歉,没有成功
  • locals().update(...) 绝不是一件有效的事情。函数的局部变量在函数编译时就已经确定了;您在运行时可以做的任何事情都无法创建额外的本地人。如果您想按名称访问按钮,只需保留 pixel_dict 并使用它。

标签: python list dictionary tkinter button


【解决方案1】:

这是因为图像one_pixel_sizegrid_creator() 完成后被垃圾回收。将one_pixel_size 声明为全局:

def grid_creator(frame, height, width):
    global one_pixel_size
    ...

您还需要应用@TheLizzard 评论中提到的修复。

【讨论】:

  • 非常感谢,它现在正在工作。 @acw1668
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多