gpt4 book ai didi

python - 如何将两个或多个参数传递给 Button 命令?

转载 作者:行者123 更新时间:2023-12-01 00:40:49 26 4
gpt4 key购买 nike

我想在函数中传递 2 个变量参数,以分配给 Button command。这些变量在 for 循环中发生变化,该循环也创建了按钮。

主要受到一些热门答案的启发 herehere ,以下是我根据我所读到的内容尝试解决此问题的失败尝试:

我尝试使用部分:

self.dct[(i, j)] = Button(command=partial(self.on_click, i, j))

再次尝试:

self.dct[(i, j)] = Button(command=partial(partial(self.on_click, i), j))

还有一个:

self.dct[(i, j)] = Button(command=partial(self.on_click, [i, j]))

..你猜怎么着?

tup = [i, j]
self.dct[(i, j)] = Button(command=partial(self.on_click, tup))

然后,lambda:

self.dct[(i, j)] = Button(command=lambda i=i, j=j: self.on_click(i, j))

这是我的代码:

import tkinter as tk

from functools import partial


class Board(tk.Frame):
board = None
images = None
tile = None

def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.tile = {}
for i in range(10):
for j in range(10):
self.tile[(i, j)]['btn_obj'] = tk.Button(self.board, command=partial(partial(self.on_click, i), j))

def on_click(self, i, j):
print("X: {}, Y:{}".format(j, i))

partial 总是会导致如下错误:

TypeError: on_click() takes 2 positional arguments but 3 were given

参数数量总是不匹配。

同时,lambda 获取了错误的变量值,导致 tkinter 部分出现错误。

最佳答案

您问题中的 lambda 应该有效:

tk.Button(self.board, command=lambda i=i, j=j: self.on_click(i,j))

这会将值 ij 绑定(bind)为 lambda 参数的默认值。

就我个人而言,我更喜欢 lambda 而不是partial,主要是因为我不必导入 functools 模块。如果您想使用部分,它应该类似于您的第一个示例:

tk.Button(self, command=partial(self.on_click, i, j))

在这两种情况下,on_click 将根据创建按钮时的值传递 ij 的正确值。

这是一个基于您的代码的示例,但为了清晰起见,删除了一些不必要的代码:

import tkinter as tk
from functools import partial


class Board(tk.Frame):
def __init__(self, parent, method):
tk.Frame.__init__(self, parent, bd=2, relief="sunken")
for i in range(10):
for j in range(10):
if method == "lambda":
button = tk.Button(self, command=lambda i=i, j=j: self.on_click(i,j))
else:
button = tk.Button(self, command=partial(self.on_click, i, j))
button.grid(row=i, column=j)

def on_click(self, i, j):
print("X: {}, Y:{}".format(j, i))

root = tk.Tk()
board1 = Board(root, method="lambda")
board2 = Board(root, method="partial")
board1.pack(side="top", fill="both", expand=True)
board2.pack(side="top", fill="both", expand=True)
root.mainloop()

关于python - 如何将两个或多个参数传递给 Button 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57364725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com