我有几个定义的函数,我想在GUI中为它们创建按钮。其中一些函数需要一个或两个参数(数字),这就是给我带来问题的原因。我曾考虑过一个按钮和一个条目的组合,当我点击特定按钮(针对我的一个函数)时,我键入数字的地方会弹出一个条目。然后,当我按下回车键时,我希望这个数字用作我绑定到按钮的函数的参数,然后应该执行该函数。
1我想绑定到按钮的功能:
def move(power, tacho_units):
MOTOR_CONTROL.cmd(5, power, tacho_units, speedreg=0, smoothstart=1, brake=0)
is_ready(5)
我们正在与乐高思维风暴合作,所以我很确定,例如,上面的功能可能会让一些人感到困惑。
from Tkinter import *
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.button = Button(frame, text="Move", command=!_______!)
self.button.pack(side=LEFT)
root = Tk()
app = App(root)
root.mainloop()
root.destroy()
有人给我什么建议/解决方案吗?如果有人能帮我,我将不胜感激。我是否创建了一个函数(可以打开一个带有条目的新窗口),当我单击"移动"按钮时调用它?当我按下回车键时,我在条目中键入的数字(功率和转速单位)就是我想要用于移动功能的数字。
通常,将参数传递给与小部件关联的函数的方法是使用lambda或functools.partal(注意:这些方法不仅仅是)。这两个主题都有点高级,但如果你只是以一个例子为例,在不完全理解它们的情况下使用它们是相当安全的。
下面是一个使用lambda:的例子
b = tk.Button(..., command=lambda power=1, tacho_units="x": move(power, tacho_units)
虽然在技术上不正确,但可以将lambda想象成一个"def",但没有名称。它接受参数并可以调用函数。
使用functools.partial:也是如此
b = tk.Button(..., command=functools.partial(move, power=1, tacho_units="x"))
注意:您必须为functools添加一个import语句。
functools.partial本质上复制函数(在本例中为move)并为参数提供默认值。因此,当您在没有参数的情况下调用它时(正如tkinter默认情况下所做的那样),参数将具有这些默认值。
然而。。。
通常,编写一个函数来调用您的函数会更容易。这个额外函数的目的是收集输入——可能来自其他小部件——然后调用最终函数。例如:
def do_move():
power = power_input.get()
tacho_units = tacho_input.get()
move(power, tacho_units)
b = tk.Button(..., command=do_move)
是否使用第三种方法取决于参数值的来源。如果您在创建小部件时知道这些值,那么使用lambda或functools.partal就可以了,因为您可以在那里嵌入参数。如果您要从其他小部件中获取参数,那么第三种形式更可取。
使用lambda
函数分配带有参数的函数
some_power = ... # set value
some_tacho_units = ... # set value
self.button = Button(frame, text="Move", command=lambda a=some_power,b=some_tacho_units:move(a, b) )
或
self.button = Button(frame, text="Move", command=lambda:move(5, 10))