【问题标题】:Tkinter button and entryTkinter 按钮和条目
【发布时间】:2013-12-04 18:39:22
【问题描述】:

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

【问题讨论】:

  • 请在您的问题中包含一些代码。
  • 我有一个建议 - 显示代码。

标签: function button tkinter tkinter-entry


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答!由于 power 和 tacho_units 每次都不相同,所以我会提出第三个建议。假设我想从入口小部件中获取 power 和 tacho_units。我一直在想,当我点击移动按钮时,会打开一个条目。当我输入移动函数的参数并按下回车键时,这些参数将与移动函数一起使用。由于我是 tkinter 的新手,所以我不知道如何编写它。这是一个好方法,还是有更简单/更好的解决方案?
  • @user3067156:如果不了解您的完整程序的更多信息,就不可能说出最好的方法。因为我个人认为对话框是糟糕的 UI 设计,所以对我来说,最好的方法是在主窗口中设置条目小部件,因此您可以先输入值,然后然后单击“移动”。这只是我的看法,客观上并不是更好的解决方案。
  • 任何事情都对我有好处,只要我能让它工作 :) 如果我想在我的主窗口中拥有条目小部件。如何将条目小部件与我的按钮连接起来?很抱歉所有问题,但我已经被困了好几天了,我不知道如何自己解决这个问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多