1

我有几个定义的函数,我想在我的 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)是我希望在按下回车键时用于函数移动的数字。

4

2 回答 2

1

通常,将参数传递给与小部件关联的函数的方法是使用lambdafunctools.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 添加一个导入语句。

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 可以工作,因为您可以在那里嵌入参数。如果您要从其他小部件获取参数,则最好使用第三种形式。

于 2013-12-04T19:32:07.497 回答
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))
于 2013-12-04T19:31:40.877 回答