【问题标题】:Tkinter button's commands while button is inside a class按钮在类内时的 Tkinter 按钮命令
【发布时间】:2019-07-31 20:21:32
【问题描述】:

我正在 Tkinter 中构建一个 GUI 应用程序,并使用 OOP 方法构建我的程序。我创建了一个 tk.Tk() 实例和一个从 tk.Frame 继承的类,将 Tk() 实例作为参数,我在类中创建了 GUI 及其背后的逻辑。

在类中,我创建了一个画布,在上面放置了一些小部件。我的一个小部件是一个条目,另一个是一个按钮。按钮的命令应该是一个函数,它将条目的 current 值作为输入参数(使用 Entry.get()) 方法并对其执行某些操作,例如将其打印到屏幕上。

这是我重新创建问题的一些代码:

import tkinter as tk

class myClass(tk.Frame):
    def __init__(self, master):
        super(myClass, self).__init__(master)
        self.pack()
        self.Widgets()

    def getVal(self, val):
        print("The value is: ", val)

    def Widgets(self):
        canvas = tk.Canvas(self, width=500, height=500, bg='green')
        canvas.grid(row=0, column=0)
        entry = tk.Entry()
        button = tk.Button(text='pressme')
        button['command'] = lambda arg = entry.get() : self.getVal(arg)

        window = canvas.create_window(100, 100, window=entry)
        window2 = canvas.create_window(100, 200, window=button)

root = tk.Tk()
root.title("MyGUI")
classinstance = myClass(root)
root.mainloop()

类中的函数 'getVal' 应该打印参数的值在哪里应该是 GUI 条目中的 current 值。问题是我的程序只看到了这个条目的初始值(在这种情况下是一个空字符串),并且在我在运行时更新 GUI 之后没有更改它。

现在我假设这是因为在 ma​​in.py 程序中,在应用程序进入 tkinter 的 mainloop() 函数之前,使用一些默认值创建了类实例,一旦进入这个循环函数,我就无法返回内部类并更改值。请帮我纠正这个问题并向我解释如何制作我的应用程序,以便按钮的命令获取条目值的更新版本,而不是初始值。 感谢您阅读我的帖子!

【问题讨论】:

  • 你写lambda arg = entry.get() : self.getVal(arg)而不是lambda: self.getVal(entry.get())有什么原因吗?是什么让您认为这里需要一个默认参数?
  • 我想让代码更清晰 :D。我想我明白问题所在了。 lambda 函数始终使用 'arg' 的原始值。谢谢你。我怎样才能接受您的解决方案?
  • 你不能。如果您愿意,您可以编写并接受您自己的答案。

标签: python tkinter


【解决方案1】:

正如@Aran-Fey 指出的那样,lambda 函数始终使用 'arg' 的原始值,而不是更改它。为了使它工作,应该使用 entry.get() 方法而不是默认参数:

lambda: self.getVal(entry.get())

【讨论】:

    【解决方案2】:

    错误位于按钮的函数中,因为lambda arg = entry.get() 仅在创建按钮时导入arg。 然后,当按下按钮时,lambda 会将开头获得的arg 的值传递给函数,而不需要重新导入。

    import tkinter as tk
    
    class myClass(tk.Frame):
        def __init__(self, master):
            super(myClass, self).__init__(master)
            self.pack()
            self.Widgets()
    
        def getVal(self, val):
            print("The value is: ", val)
    
        def Widgets(self):
            canvas = tk.Canvas(self, width=500, height=500, bg='green')
            canvas.grid(row=0, column=0)
            var = tk.StringVar()
            entry = tk.Entry(textvariable = var)
            button = tk.Button(text='pressme')
            button['command'] = lambda: self.getVal(var.get())
    
            window = canvas.create_window(100, 100, window=entry)
            window2 = canvas.create_window(100, 200, window=button)
    
    root = tk.Tk()
    root.title("MyGUI")
    classinstance = myClass(root)
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 2023-02-24
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2017-12-23
      相关资源
      最近更新 更多