按钮的命令可以使用包括按钮在内的函数中的变量吗?
Can a button's command use variables from the function including the button?
我有一个函数可以创建一些标签和输入字段以及一个按钮。我希望按钮的命令功能通过该功能管理对象。我可以在不使变量成为全局变量的情况下执行此操作吗?
代码如下:
def add_clicked():
cuspsInfo.append((int(xInput.get()), int(yInput.get()), indexInput.get()))
xInput.delete(0, END)
yInput.delete(0, END)
indexInput.delete(0, END)
def startup_menu():
global cuspsInfo
cuspsInfo = []
global label
label = Label(window, text="Add a cusp:", font=("Arial", 20, "bold"),
fg=SECOND_COLOR, bg=FIRST_COLOR)
label.place(relx=0.5, rely=0.3, anchor=CENTER)
global xInput
global yInput
global indexInput
xInput = Entry(window)
xInput.place(relx=0.52, rely=0.4, anchor=CENTER)
yInput = Entry(window)
yInput.place(relx=0.52, rely=0.45, anchor=CENTER)
indexInput = Entry(window)
indexInput.place(relx=0.52, rely=0.5, anchor=CENTER)
global xLabel
global yLabel
global indexLabel
xLabel = Label(window, text="x(0-500):", font=(
"Arial", 20, "bold"), fg=SECOND_COLOR, bg=FIRST_COLOR)
xLabel.place(relx=0.34, rely=0.4, anchor=CENTER)
yLabel = Label(window, text="y(0-500):", font=(
"Arial", 20, "bold"), fg=SECOND_COLOR, bg=FIRST_COLOR)
yLabel.place(relx=0.34, rely=0.45, anchor=CENTER)
indexLabel = Label(window, text="name:", font=(
"Arial", 20, "bold"), fg=SECOND_COLOR, bg=FIRST_COLOR)
indexLabel.place(relx=0.36, rely=0.5, anchor=CENTER)
global addButton
global runButton
addButton = Button(window, text="add", command=add_clicked)
addButton.place(relx=0.45, rely=0.6, anchor=CENTER)
runButton = Button(window, text="run", command=run_clicked)
runButton.place(relx=0.55, rely=0.6, anchor=CENTER)
我会“部分应用”该功能。首先,更改回调以接受四个参数:
def add_clicked(x_in, y_in, index_input, cusps_info):
cusps_info.append((int(x_in.get()), int(y_in.get()), index_input.get()))
x_in.delete(0, END)
y_in.delete(0, END)
index_input.delete(0, END)
现在,将对该回调的调用包装在另一个函数中,然后提供参数。这可以用一个简单的 lambda
:
addButton = Button(window, text="add", command=lambda: add_clicked(xInput, yInput, indexInput, cuspsInfo))
或 functools.partial
:
from functools import partial
addButton = Button(window, text="add", command=partial(add_clicked, xInput, yInput, indexInput, cuspsInfo))
两者具有相同的效果:参数是“预先提供的”,以便稍后可以在没有任何参数的情况下调用回调。
正如您所见,随着参数数量的增加,这变得越来越混乱。此技术最适合较少数量的参数。如果您有大量数据需要传递到一个函数中,将它们放入 NamedTuple
或完全自定义的 class 中可能是有意义的(如果它们都非常相似并且放在一起有意义).
我有一个函数可以创建一些标签和输入字段以及一个按钮。我希望按钮的命令功能通过该功能管理对象。我可以在不使变量成为全局变量的情况下执行此操作吗?
代码如下:
def add_clicked():
cuspsInfo.append((int(xInput.get()), int(yInput.get()), indexInput.get()))
xInput.delete(0, END)
yInput.delete(0, END)
indexInput.delete(0, END)
def startup_menu():
global cuspsInfo
cuspsInfo = []
global label
label = Label(window, text="Add a cusp:", font=("Arial", 20, "bold"),
fg=SECOND_COLOR, bg=FIRST_COLOR)
label.place(relx=0.5, rely=0.3, anchor=CENTER)
global xInput
global yInput
global indexInput
xInput = Entry(window)
xInput.place(relx=0.52, rely=0.4, anchor=CENTER)
yInput = Entry(window)
yInput.place(relx=0.52, rely=0.45, anchor=CENTER)
indexInput = Entry(window)
indexInput.place(relx=0.52, rely=0.5, anchor=CENTER)
global xLabel
global yLabel
global indexLabel
xLabel = Label(window, text="x(0-500):", font=(
"Arial", 20, "bold"), fg=SECOND_COLOR, bg=FIRST_COLOR)
xLabel.place(relx=0.34, rely=0.4, anchor=CENTER)
yLabel = Label(window, text="y(0-500):", font=(
"Arial", 20, "bold"), fg=SECOND_COLOR, bg=FIRST_COLOR)
yLabel.place(relx=0.34, rely=0.45, anchor=CENTER)
indexLabel = Label(window, text="name:", font=(
"Arial", 20, "bold"), fg=SECOND_COLOR, bg=FIRST_COLOR)
indexLabel.place(relx=0.36, rely=0.5, anchor=CENTER)
global addButton
global runButton
addButton = Button(window, text="add", command=add_clicked)
addButton.place(relx=0.45, rely=0.6, anchor=CENTER)
runButton = Button(window, text="run", command=run_clicked)
runButton.place(relx=0.55, rely=0.6, anchor=CENTER)
我会“部分应用”该功能。首先,更改回调以接受四个参数:
def add_clicked(x_in, y_in, index_input, cusps_info):
cusps_info.append((int(x_in.get()), int(y_in.get()), index_input.get()))
x_in.delete(0, END)
y_in.delete(0, END)
index_input.delete(0, END)
现在,将对该回调的调用包装在另一个函数中,然后提供参数。这可以用一个简单的 lambda
:
addButton = Button(window, text="add", command=lambda: add_clicked(xInput, yInput, indexInput, cuspsInfo))
或 functools.partial
:
from functools import partial
addButton = Button(window, text="add", command=partial(add_clicked, xInput, yInput, indexInput, cuspsInfo))
两者具有相同的效果:参数是“预先提供的”,以便稍后可以在没有任何参数的情况下调用回调。
正如您所见,随着参数数量的增加,这变得越来越混乱。此技术最适合较少数量的参数。如果您有大量数据需要传递到一个函数中,将它们放入 NamedTuple
或完全自定义的 class 中可能是有意义的(如果它们都非常相似并且放在一起有意义).