【问题标题】:Python ttk buttons. Passing args to OnClickPython ttk 按钮。将参数传递给 OnClick
【发布时间】:2020-02-10 04:55:13
【问题描述】:

我对 Python 还很陌生,并且对在这个论坛上发帖完全陌生(我已经使用它多年,但通常更幸运的是通过搜索过去的问题找到答案。不过我今天很难过)。

rows = 8
columns = 8

def onClick(args):
    print("args: ", args)

myButtons = []

myButtons = [ ttk.Button(mainframe, text=str(i) + str(j), command=lambda:onClick([int(i),int(j)])) for i in range(columns) for j in range(rows) ]

for i in range(columns) :
    for j in range(rows):
        myButtons[i*rows+j].grid(column=i, row=j)

(我没有包含所有的网格创建代码,但它工作正常,按钮正在显示。)。

我正在尝试为网格中的按钮调用单击事件。我尝试创建具有不同参数的按钮,并传递给 onClick 事件,以便我知道单击了哪个按钮。我确信这在我单独创建按钮时有效,而不是在我使用列表理解创建它们时。不过现在,无论我点击哪个按钮,我都会得到:

args: [7,7]

谁能指出我哪里出错了?

谢谢!

【问题讨论】:

  • 我想这可能是tkinter command的原因
  • 这能回答你的问题吗? Python and Tkinter lambda function
  • 感谢您抽出宝贵时间回复。 acw1668 的回答让我明白了。

标签: python tkinter lambda ttk


【解决方案1】:

您需要在lambda 中使用参数的默认值:

myButtons = [ttk.Button(mainframe, text=str(i)+str(j), command=lambda i=i,j=j: onClick([i,j])) for i in range(columns) for j in range(rows)]

您还可以将列表推导式和 for 循环结合在一起:

myButtons = []
for i in range(columns):
    for j in range(rows):
        btn = ttk.Button(mainframe, text=str(i)+str(j),
                        command=lambda i=i,j=j:onClick([i,j]))
        btn.grid(column=i, row=j)
        myButtons.append(btn)

【讨论】:

  • 非常感谢,快速修复,我已经启动并运行,还有一个有用的补充。 for 循环组合。
【解决方案2】:

使用事件处理程序捕获 i 和 j 的小改动:

def on_click(args):
    print("args: ", args)


def click_handler(args):
    return lambda: on_click(args)


myButtons = [ttk.Button(mainframe, text=str(i) + str(j), command=lambda: click_handler([int(i),int(j)])) for i in range(8) for j in range(8)]

# for ...

【讨论】:

  • 感谢您抽出宝贵时间回复。 acw1668 的回答让我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 2018-04-19
  • 2015-02-07
相关资源
最近更新 更多