2017-02-08 25 views
1

ttk.Frameオブジェクトのサブクラスを作成しようとしていますが、親のinitメソッドにキーワード引数を渡すことができません。ここに私のクラスのストリップダウンバージョンは次のとおりです。Python:ttk.Frameから継承する際にキーワード引数を使用できない

from tkinter import ttk 

class MyFrame(ttk.Frame): 
    def __init__(self, parent, **kwargs):      
     super(MyFrame, self).__init__(parent, kwargs) 

ここで(ルートがtkinter.Tk()に割り当てられている)私のクラスのインスタンスを作成しようとする例です:ときに私

my_frame = MyFrame(root, borderwidth=5) 

そして、ここではエラーになります私のクラスのインスタンスを作成しよう:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "C:\Users\csmith\Documents\tmp\frame_test.py", line 5, in __init__ 
ttk.Frame.__init__(self, parent, kwargs) 
TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given 

私はキーワード引数を使用している間、フレームオブジェクトを作成することが可能です知っているが、私は、なぜ私を見つけ出すように見えることはできませんFrameのinitメソッドにキーワード引数を渡すクラスを作成できません。アドバイスありがとうございます!

+0

に、あなたのすべてのコードを示してもらえますか? – Jake

+0

@Jakeデバッグには十分なコードです。与えられたコードを実行するときに、エラーを再現することができます。 –

答えて

1

kwargsを関数に渡すときは、代わりに**kwargsを使用してください。これは、すべてkwargsを1つずつ入れなければならないので、「kwargsとして解凍」を意味します。 'Unpack'は、Pythonがそれを行うことを意味します。

変更

super(MyFrame, self).__init__(parent, kwargs) 

super(MyFrame, self).__init__(parent, **kwargs) 
+0

ありがとうございます。これは私の問題を解決するように思えた。私は 'kwargs'と' ** kwargs'の違いについて少し混乱していると思います。私はFrameクラスの宣言を見て、Widgetクラスにキーワード引数を渡すことに気付きました。これは、次のようにinitメソッドでアンパックしません。 'Widget .__ init __(self、master、" ttk :: frame "、kw)' 。この場合、キーワードを展開しない理由はありますか? –

+0

私はCanvasではなくFrameのinitメソッドを呼び出すときにkwargs辞書を解凍する必要がある理由を理解しました。これは、Cavnasのinitメソッドのシグネチャには構成ディクショナリが含まれているためです。 'def __init __(self、master = None、cnf = {}、** kw):'は、kwargsディクショナリを有効な引数として使用します。 ttk.Frameクラスにはこのパラメータが含まれていないため、解凍する必要があります。より詳細な説明については、この記事を参照してください:http://stackoverflow.com/questions/34866697/cnf-argument-for-tkinter-widgets –

関連する問題