将StringVar对象从Entry传递到tkinter中的函数内的Label

时间:2015-01-16 22:51:41

标签: python-3.x tkinter

嗨,我一直在努力让这个工作,每次我改变一些东西,我收到另一个错误。我一直在尝试创建一个带有功能的输入框,然后将输入框中的变量转换为按下按钮创建的标签。当我试图这样做时,经常出现这个错误。

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()

2 个答案:

答案 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)
        ...