Tkinter条目小部件有问题

时间:2012-10-22 12:07:21

标签: python widget tkinter

我正在关注tkinter的这个介绍,特别是第29页的对话框输入示例。http://www.ittc.ku.edu/~niehaus/classes/448-s04/448-standard/tkinter-intro.pdf

我收到以下错误:

d = MyDialog(root)
TypeError: this constructor takes no arguments

我从变量d中删除了参数,并且wait_window的参数(参见下面的代码)和程序将运行,但是没有输入字段。

这是代码

from Tkinter import *

class MyDialog:

    def init(self, parent):

        top = Toplevel(parent)

        Label(top, text="Value").pack()

        self.e = Entry(top)
        self.e.pack(padx=5)

        b = Button(top, text="OK", command=self.ok)
        b.pack(pady=5)

    def ok(self):
        print "value is", self.e.get()

        self.top.destroy()

root = Tk()
Button(root, text="Hello!").pack()
root.update()

d = MyDialog(root)

root.wait_window(d.top)

2 个答案:

答案 0 :(得分:3)

更改

def init(self, parent):

def __init__(self, parent):

请参阅object.__init__的文档。

答案 1 :(得分:3)

您需要更改

def init(self, parent):
    ... 

def __init__(self, parent):
    ...

(请注意包围双下划线)。

在python中,文档对它所谓的构造函数有点模糊,但__init__通常被称为构造函数(尽管有些人认为这是__new__的工作。)。除了语义之外,传递给MyClass(arg1,arg2,...)的参数将传递给__init__(前提是你不在__new__做有趣的事情,这是一个不同时间的讨论)。 e.g:

class MyFoo(object): #Inherit from object.  It's a good idea
    def __init__(self,foo,bar):
       self.foo = foo
       self.bar = bar

my_instance = MyFoo("foo","bar")

由于您的代码是,因为您没有定义__init__,所以使用的默认值相当于:

def __init__(self): pass

不带参数(强制self除外)


你还需要这样做:

self.top = Toplevel(...)

以后你尝试获取top属性(d.top),但d没有属性top,因为你从未添加过属性。