【问题标题】:how do I pass self.selected(i)? - Python [duplicate]我如何通过 self.selected(i)? - Python [重复]
【发布时间】:2016-05-03 00:37:32
【问题描述】:
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()

无论如何,当我运行它时,我得到了一个 10x10 正方形中的 100 个按钮的网格,这正是我想要的方式,但问题是 command=self.selected(i) 似乎让所有按钮都执行自我操作。 selected(100) and no 1,2,3,4... 100. 我在这里做错了吗?

我想使用“列表”或“数组”来执行此操作,因为它比写出 100 个按钮要容易得多。

【问题讨论】:

    标签: python arrays function lambda parameter-passing


    【解决方案1】:

    尝试更改此行,

    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,它不会随着循环迭代的继续而改变。

    【讨论】:

    • 非常感谢!它完美无缺! :D
    【解决方案2】:

    您可以执行以下操作

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 2020-01-13
      • 2014-09-17
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多