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

(2 つのアンダースコアを括弧で囲んでいることに注意してください)。

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 に答える