我有几个已定义的函数,我想在GUI中创建按钮。其中一些函数需要一个或两个参数(数字),这就是给我带来问题的原因。我想过一个按钮和一个条目的组合,当我点击特定按钮(对于我的一个功能)时,会弹出一个条目,我输入一个数字。然后,当我按下回车时,我希望这个数字用作我已经绑定到我的按钮的函数的参数,然后该函数应该被执行。
1我希望绑定到按钮的功能:
def move(power, tacho_units):
MOTOR_CONTROL.cmd(5, power, tacho_units, speedreg=0, smoothstart=1, brake=0)
is_ready(5)
我们正在与Lego Mindstorms合作,所以我很确定,例如上面的功能对某些人来说可能有点混乱。
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()
有人对我有任何建议/解决方案吗?如果有人能帮助我,我将不胜感激。我单击“移动”按钮时是否创建了一个函数(将打开带有条目的新窗口)?我在条目中输入的数字(此函数中的幂和tacho_units)是我在按Enter键时用于函数Move的内容。
答案 0 :(得分:0)
使用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))
答案 1 :(得分:0)
通常,将参数传递给与窗口小部件关联的函数的方法是使用lambda或functools.partial(注意:这些不是唯一的方式)。这两个都是一些高级主题,但如果你只是按照一个例子,在没有完全理解它们的情况下使用它们是相当安全的。
以下是使用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.partial可以正常工作,因为您可以在那里嵌入参数。如果您要从其他小部件获取参数,则第三种形式更可取。