嗨,我一直在努力让这个工作,每次我改变一些东西,我收到另一个错误。我一直在尝试创建一个带有功能的输入框,然后将输入框中的变量转换为按下按钮创建的标签。当我试图这样做时,经常出现这个错误。
TypeError: get() missing 1 required positional argument: 'self'
然后我把自己放在方法括号中。
command = lambda: x.myFunc(self.my_variable.get(self))
然后是另一个错误,我不知道如何理清。
AttributeError: 'My_Class' object has no attribute '_tk'
以下是完整的代码,我是类和self
的新手,所以欢迎任何更正。
from tkinter import *
import time
class My_Class:
def start(self):
self.root=Tk()
self.my_variable=StringVar
self.entry_box=Entry(self.root, textvariable=self.my_variable)
self.entry_box.pack()
self.button=Button(self.root,text="Pass variable now",
command=lambda:x.myFunc(self.my_variable.get(self)))
self.button.pack()
def myFunc(self,my_variable):
self.lab=Label(self.root,text=self.my_variable)
self.lab.pack()
x=My_Class()
x.start()
答案 0 :(得分:1)
这是创建StringVar
对象的正确方法:
text = StringVar() # note additional ()
您能解释一下x
在以下声明中的含义:
lambda: x.myFunc(self.my_variable.get(self))
x
在课堂内不可见,因为它在课堂外声明。
myFunc
没有正确缩进:您应该像__init__
方法一样缩进它。
我真的建议你在继续之前观看一些关于OOP的教程。您基本上是在猜测OOP的工作原理。
答案 1 :(得分:1)
如果你制作myFunc
一个方法,如果你可能要做的课程;因为你的缩进错误而很难知道,你不必通过任何东西到myFunc
。该函数可以访问类中的所有内容,因此可以在需要时获取所需内容。这样可以省去lambda
的使用,这有助于降低复杂性。
此外,您通常根本不需要StringVar
,这只是需要跟踪的一件事。但是,如果您确实需要标签和条目来显示完全相同的数据,请让它们共享相同的textvariable并自动更新文本,而无需调用函数,或从窗口小部件获取值,或设置值n标签。
以下是不使用StringVar
的示例:
class My_Class:
def start(self):
...
self.entry_box = Entry(self.root)
self.button = Button(..., command = self.myFunc)
...
def myFunc(self):
s = self.entry_box.get()
self.lab = Label(..., text = s)
...