我正在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,并且一旦进入该循环函数,我便无法返回内部类并更改值。请帮助我纠正此问题,并向我解释如何制作我的应用程序,以便按钮的命令获得条目值的更新版本,而不是初始值。 感谢您阅读我的帖子!
答案 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()