我的代码为输入框返回一个空值

时间:2014-01-20 05:37:09

标签: python-2.7 tkinter

请检查以下代码;按下添加按钮时,必须使用添加功能输入并打印出框中输入的文本值 我的olde代码用于返回输入框的PY_VAR1值,这是我的旧代码My entry box always returns PY_VAR1 value!!though I'm using the .get function的链接

from Tkinter import *
root = Tk()
class Addcase:
    def mains(self):
        master = Tk()
        master.wm_title("Add")
        self.content = StringVar()
        self.text = StringVar()
        self.bz = Button(master,text="add",command=self.add)
        self.bz.pack()
        self.l = Label(master,text="ok")
        self.l.pack()
        self.e = Entry(master,textvariable=self.content)
        self.e.pack()
        print self.content.get() + "hello"
        master.mainloop()
    def add(me):
            print "this is the entered text"
            print me.content.get()

def calladd():
    z = Addcase()
    z.mains  


def main():
    calling = Addcase()
    root.wm_title("Hello, me")
    b = Button(root, text="Add a case",command=calling.mains)
    b.pack()
    mainloop()

if __name__ == '__main__':
  main()

1 个答案:

答案 0 :(得分:1)

这里的问题是你通过两次调用Tk()来创建两个根。你做不到;如果你这样做,会发生各种奇怪的事情。

在这种情况下,发生的奇怪事情是self.content最终成为第一个根的一部分,直到秒才有机会运行 root完成其mainloop。因此,StringVar内容永远不会更新。

(如果你仔细观察,你也会注意到原来的窗口没有对事件做出正确反应。这对不同的平台产生了不同的影响 - 如果你将另一个窗口拖过它就不刷新它的显示在您关闭第二个窗口之前单击按钮时,看起来完全响应但实际上没有做任何事情。)

如果要创建一个与根在同一主循环中运行的新顶级窗口,可以使用Toplevel来完成。

因此,在Addcase.mains的顶部,不要执行master = Tk(),而是执行master = Toplevel()。然后,在底部,删除master.mainloop()电话。

但是,为Tkinter遵循更标准的惯用模式真的会更好。你有一个类只是用作mains函数的持有者。构造类的实例不会做任何事情;调用该函数可以完成所有事将函数写为函数会更清楚(在这种情况下add将是该函数中的本地函数),或者编写一个初始化其__init__中的事物的类(并且可能继承自Toplevel而不是包含它。查看文档中的示例,了解如何进行各种操作。