Tkinter按钮在类内部时的命令

时间:2019-03-10 09:30:42

标签: python tkinter

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

在课堂上,我创建了一个画布,上面放置了一些小部件。我的一个小部件是一个条目,另一个是按钮。按钮的命令应该是一个函数,该函数将entry的 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时之后没有更改它。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

该错误位于按钮的功能中,因为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()