我正在关注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)
答案 0 :(得分:3)
答案 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
,因为你从未添加过属性。