我如何通过自我选择(i)? - Python

时间:2016-05-03 00:37:33

标签: python arrays function lambda parameter-passing

from tkinter import *

class App:
    def __init__(self, master):
        frame = Frame(master)
        frame.grid()
        self.grid_data_table = ["NONE"]
        self.D_Text = "    "
        self.a = 0
        self.b = 0

        for i in range(1,100 + 1):
            self.grid_data_table.extend([i])
            self.grid_data_table[i] = Button(frame, text=self.D_Text, font="bold", command=lambda: self.selected(i))

            self.a = self.a + 1
            self.grid_data_table[i].grid(row=self.b, column=self.a)
            #self.grid_data_table[i]["text"] = str(i) # testing only

            if self.a == 10:
                self.b = self.b + 1
                self.a = 0




    def selected(self, num):
        print("Loaded Button:", num)

root = Tk()
app = App(root)
root.mainloop()

无论如何,当我运行这个时,我得到了10个10平方米的100个按钮的网格,就像我想要的那样,但问题是command = self.selected(i)似乎让所有按钮都自行完成。选择(100)和没有1,2,3,4 ... 100.我在这里做错了吗?

我想使用"列表"或"数组"这样做是因为它比编写100个按钮容易得多。

2 个答案:

答案 0 :(得分:2)

尝试更改此行,

self.grid_data_table[i] = Button(frame, text=self.D_Text, font="bold", command=lambda: self.selected(i))

self.grid_data_table[i] = Button(frame, text=self.D_Text, font="bold", command=lambda i=i: self.selected(i))

问题是当前代码正在关闭变量i,因此在每个命令中它等于在函数外部设置的任何内容。在添加i=i之前创建一个本地范围的变量i,它不会随着循环迭代的继续而改变。

答案 1 :(得分:0)

您可以执行以下操作

command=lambda i=i: self.selected(i)

您正在创建所谓的闭包,当您的命令执行时,它会在该点捕获i的值(因此始终为100),而不是在创建按钮时。如果将i分配给另一个局部变量,则在创建Button的位置捕获其值。