可以在动态创建窗口小部件后配置它吗?

时间:2017-06-07 17:19:59

标签: python tkinter

所以我一直在寻找答案,但找不到任何例子。

我想知道你是否可以在tkinter中使用所有相同的变量名创建多个按钮或标签或任何小部件,然后能够在创建它之后直接定位该小部件。

以下是一些代码示例,它将创建具有相同变量名称的5个按钮,如果按下按钮,它将在所述按钮上打印文本。

import tkinter as tk

btn_names = ["1st Button", "2nd Button", "3rd Button", "4th Button", "5th Button"]

class MyButton(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.createButtons()

    def createButtons(self):

        row_count = 0

        for n in range(5):
            someButton = tk.Button(self.parent, text=btn_names[n], command= lambda t=btn_names[n]: self.getText(t))
            someButton.grid(row = row_count, column = 0)
            row_count += 1

    def getText(self, text):
        print(text)


if __name__ == "__main__":
    root = tk.Tk()
    myApp = MyButton(root)


    root.mainloop()

现在我无法弄清楚的是,是否可以对所述按钮进行更改。就像我现在想要更改按钮背景和前景颜色,但我没有办法定位我想要编辑的按钮。

我不能这样做:

someButton.config(background = "black", foreground = "white")

因为所有按钮都被命名为someButton

是否有可能在创建此庄园后编辑创建的小部件?

1 个答案:

答案 0 :(得分:1)

我不确定这是最好的方法,但这是可能的。

不是在最初创建命令时将命令传递给按钮,而是添加一行,将命令配置为lambda函数并将someButton作为参数传递。然后在回调函数中,确保配置传递的按钮以更改其背景颜色。

import tkinter as tk

btn_names = ["1st Button", "2nd Button", "3rd Button", "4th Button", "5th 
Button"]

class MyButton(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.createButtons()

    def createButtons(self):

        row_count = 0

        for n in range(5):
            someButton = tk.Button(self.parent, text=btn_names[n])
            someButton.configure(command=lambda t=btn_names[n], btn = someButton: self.getText(t, btn))
            someButton.grid(row = row_count, column = 0)
            row_count += 1

    def getText(self, text, btn):
        print(text)
        btn.configure(background = 'black')


if __name__ == "__main__":
    root = tk.Tk()
    myApp = MyButton(root)


    root.mainloop()