Function Tkinter按钮和输入

Function Tkinter按钮和输入,function,button,tkinter,tkinter-entry,Function,Button,Tkinter,Tkinter Entry,我有两个定义的函数,我想在GUI中为它们创建按钮。其中一些函数需要一个或两个参数(数字),这就是我遇到的问题。我曾经考虑过一个按钮和一个条目之间的组合,当我点击特定的按钮(对于我的一个功能),一个条目会在我输入数字的地方弹出。然后,当我按下enter键时,我希望这个数字被用作绑定到按钮的函数的参数,然后该函数应该被执行 1要绑定到按钮的函数: def move(power, tacho_units): MOTOR_CONTROL.cmd(5, power, tacho_units, sp

我有两个定义的函数,我想在GUI中为它们创建按钮。其中一些函数需要一个或两个参数(数字),这就是我遇到的问题。我曾经考虑过一个按钮和一个条目之间的组合,当我点击特定的按钮(对于我的一个功能),一个条目会在我输入数字的地方弹出。然后,当我按下enter键时,我希望这个数字被用作绑定到按钮的函数的参数,然后该函数应该被执行

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()

有人对我有什么建议/解决方案吗?如果有人能帮助我,我将不胜感激。我是否创建了一个在单击“移动”按钮时调用的函数(该函数将打开一个包含条目的新窗口)?我在条目中输入的数字(此函数中的功率和转速单位)是我希望在按下enter键时用于函数移动的数字。

使用
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) )


使用
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) )


通常,向与小部件关联的函数传递参数的方法是使用or(注意:这不是唯一的方法)。这两个都是一些高级主题,但如果您只是按照一个例子,在不完全理解它们的情况下使用它们是相当安全的

下面是一个使用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可以起作用,因为您可以将参数嵌入其中。如果要从其他小部件获取参数,最好使用第三种形式。

通常,向与小部件关联的函数传递参数的方法是使用or(注意:这些不是唯一的方法)。这两个都是一些高级主题,但如果您只是按照一个例子,在不完全理解它们的情况下使用它们是相当安全的

下面是一个使用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可以起作用,因为您可以将参数嵌入其中。如果您要从其他小部件获取参数,最好使用第三种形式。

请在问题中包含一些代码。我有一个建议-显示代码。请在问题中包含一些代码。我有一个建议-显示代码。谢谢您的回答!因为动力和测速装置不会每次都相同,所以我会支持第三个建议。假设我想从入口小部件获取功率和转速单位。我一直在想,当我点击移动按钮时,会打开一个条目。当我输入move函数的参数并按enter键时,这些参数将与move函数一起使用。因为我是新来的,我不知道怎么写。这是一个好方法,还是有更简单/更好的解决方案?@user3067156:如果不了解您的完整程序,就不可能说什么是最好的方法。因为我个人认为对话框是糟糕的UI设计,所以对我来说,最好的方法是在主窗口中有输入窗口小部件,所以您可以先键入值,然后单击“移动”。这只是我的观点,这不是一个客观上更好的解决方案。只要我能做到这一点,任何事情都对我有好处:)如果我在我的主窗口中使用入口小部件。如何将条目小部件与按钮连接?对不起,所有的问题,但我已经被困在这几天,我不知道如何解决我自己。谢谢你的回答!因为动力和测速装置不会每次都相同,所以我会支持第三个建议。假设我想从入口小部件获取功率和转速单位。我一直在想,当我点击移动按钮时,会打开一个条目。当我输入move函数的参数并按enter键时,这些参数将与move函数一起使用。因为我是新来的,我不知道怎么写。这是一个好方法,还是有更简单/更好的解决方案?@user3067156:如果不了解您的完整程序,就不可能说什么是最好的方法。自从