通过循环使tkinter按钮后,按钮不可单击

时间:2019-07-11 21:58:32

标签: python-3.x

使用tkinter制作按钮数组之后,这些按钮将无法单击,几乎就像我为每个按钮分配的唯一命令没有遵守每个按钮一样

我尝试使用lambda方法和局部方法,但似乎都不起作用

import tkinter as tk
from functools import partial

#Sets root as Tk
root = Tk()

#Makes our GUI space
canvas = Canvas(root, width = 1600, height = 1100, bg = "white")

class App:

def clicked(self, i):
    print("Clicked")
    print(self.button[i])

def __init__(self, root): 

    self.root = root
    self.button = [];

    #Allows button size to be set in pixels
    pixel = tk.PhotoImage(width=1, height=1, master = root)

    for i in range(5):

       #Makes each button and adds it to self.button array
       self.button.append(tk.Button(root, bg = "red", image=pixel,
                     width = 10, height = 10, 
                     command=lambda: clicked(i)))

       #I have also tried:
       #command=partial(clicked, i)
       #command=lambda i=i: clicked(i)

       #Places button on canvas
       self.button[i].place(x=10*i, y=10*i, in_=canvas)

       canvas.pack()

App(root)
root.mainloop()

我希望能够单击每个按钮,并在Jupyter终端行中看到单词“ Clicked”。但是我什么也没得到...

我看过herehere以及其他一些地方,但我仍然停留在某些东西上……有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,当您调用clicked()时,解释器不希望它位于类中。

相反,您应该致电self.clicked()。当我这样做时,它几乎可以正常工作;我在python shell中得到了文本:“ Clicked。!Button5”。

唯一的问题是每个按钮都是按钮5,我认为这与循环中的按钮编号有关。声明第一个按钮后,i = 1i会像for循环中的可迭代对象一样更改值。