1

我正在关注 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)
4

2 回答 2

3

改变

def init(self, parent):

def __init__(self, parent):

请参阅 的文档object.__init__

于 2012-10-22T12:09:20.260 回答
3

你需要改变

def init(self, parent):
    ... 

def __init__(self, parent):
    ...

(注意括号内的双下划线)。

在 python 中,文档对它调用构造函数的内容有点模糊,但__init__通常被称为构造函数(尽管有些人会争辩说这是__new__.) 的工作。抛开语义不谈,传递给的参数MyClass(arg1,arg2,...)将被传递给__init__(前提是你不做有趣的事情,在__new__不同的时间进行讨论)。例如:

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

因为稍后您尝试获取顶部属性(d.top),但d没有属性top,因为您从未添加为属性。

于 2012-10-22T12:09:31.727 回答