Tkinter按钮和输入

时间:2013-12-04 18:39:22

标签: function button tkinter tkinter-entry

我有几个已定义的函数,我想在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的内容。

2 个答案:

答案 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)

通常,将参数传递给与窗口小部件关联的函数的方法是使用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添加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可以正常工作,因为您可以在那里嵌入参数。如果您要从其他小部件获取参数,则第三种形式更可取。