【问题标题】:Python Tkinter, setting up button callback functions with a loopPython Tkinter,使用循环设置按钮回调函数
【发布时间】:2014-01-10 02:49:03
【问题描述】:

我正在编写一个显示按钮网格的程序,当按下按钮时,我希望它将网格中按钮的位置(“行列”)打印到控制台。这是我所拥有的

import Tkinter as tk

class board(tk.Tk):
    def __init__(self, parent=None):
        tk.Tk.__init__(self,parent)
        self.rows = 5
        self.columns = 5
        self.init_board()

    def init_board(self):
        for i in range(self.rows):
            for j in range(self.columns):
                cmd = lambda: self.button_callback(i,j)
                b = tk.Button(self, text=str("  "), command=cmd)
                b.grid(row=i, column=j)

    def button_callback(self, row, col):
        print(str(row) + " " + str(col))


if __name__ == '__main__':
    board().mainloop()

问题是,当我单击任何按钮时,我会打印出“4 4”,这是循环中实例化的最后一个按钮的位置。我不知道为什么会这样,请帮忙!

【问题讨论】:

    标签: python python-2.7 tkinter


    【解决方案1】:

    在使用lambdaij创建的函数中指的是init_board函数中的变量,在for循环结束后设置为4、4。

    您可以使用默认参数解决此问题。


    替换以下行:

    cmd = lambda: self.button_callback(i,j)
    

    与:

    cmd = lambda i=i, j=j: self.button_callback(i,j)
    

    【讨论】:

    • @user3124924,欢迎来到 Stack Overflow!由于您是新手,您可能需要查看this link
    【解决方案2】:

    除了@falsetru 所说的,您还可以使用functools.partial

    from functools import partial
    # ...
    cmd = partial(self.button_callback, i, j)
    # ...
    

    或者你可以像这样“模仿”partial 的行为:(使用这个 sn-p 而不是 import 语句)

    def partial(fn, i, j):
        def nested():
            fn(i, j)
        return nested
    

    可以找到更好的“仿真”here

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 2021-08-27
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多