【问题标题】:Generate Button and Entry pair based on list and have the Button根据列表生成 Button 和 Entry 对并拥有 Button
【发布时间】:2022-01-19 12:35:47
【问题描述】:

我正在尝试创建一个用于与微控制器通信的 tkinter GUI。

我想创建一堆 Button - Entry 对,每个对都会向微控制器发送一个命令以及每个 Entry 的输入(特定于该命令的格式)。

我想通过遍历包含按钮名称和 Entry 小部件的格式化函数的列表来创建按钮。

请参阅下面的代码以获取示例。

import tkinter as tk

root = tk.Tk()

class ButtonEntryFrame():
    def __init__(self, parent, params, txtVar) -> None:
        self.txt = params[0]
        self.fn = params[1]
        self.txtVar = txtVar

        self.frame = tk.Frame(parent)
        self.button = tk.Button(self.frame, text=self.txt, command=self.fn(self.txtVar))
        self.entry = tk.Entry(self.frame, textvariable=self.txtVar)

        self.button.pack(side=tk.LEFT)
        self.entry.pack()
        self.frame.grid()


frameInput = tk.Frame(root)
frameInput.pack(side=tk.LEFT)


inputFunctions = [
    ('Func A', lambda x: print(f"startMotor {x} 0 1")),
    ('Func B', lambda x: print(f"stopMotor")),
    ('Func C', lambda x: print(f"increaseSpeed 100 {x} 3"))]

frames = []
for i, params in enumerate(inputFunctions):
    txtVar = tk.StringVar()
    f = ButtonEntryFrame(frameInput, params, txtVar)
    frames.append(f)

root.mainloop()

上面的代码不能正常工作。当我运行它时,直接执行并打印 lambdas。我明白为什么。

有没有可能实现我想要的?

【问题讨论】:

  • 第一个链接只解释了为什么你不能使用一个parathesis,正如描述中所说的,我知道为什么。想知道样品的意图是否有解决方案。另一个链接链接到这个问题。
  • “我明白为什么” 如果你明白为什么,你应该知道如何解决它。实际上评论中的第一个链接对此案有答案。
  • 链接帖子中的线程创建者没有和我一样的问题。我知道答案可能在对该帖子的所有回复中,而 Menno Hölscher 可能是正确的。这里的解决方案是使用“lambda 上的 lambda”。链接的帖子将解决我的第二个问题。

标签: python python-3.x tkinter


【解决方案1】:

你必须这样做:

self.button = tk.Button(self.frame, text=self.txt, command=lambda: self.fn(self.txtVar))

我添加了lambda,否则self.fn会立即被调用。

【讨论】:

  • 绝对更近了!但是,当我用你的插件运行相同的代码时,当我单击第一个按钮(无论我在条目中输入什么)“startMotor PY_VAR0 0 1”时,我会得到以下输出
  • 啊,那是另一回事:使用var.get() 检索 tkinter var 的值。
  • 谢谢你,像时钟一样工作!
猜你喜欢
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多