2017-07-05 3 views
0

私の意図は、いくつかのクラスからguiを作成し、私は小さな例を作成練習としてです。 appで見ることができるように、self.greetはButtonクラスからボタンを作成する必要がありますが、私が得るのは汎用ボタン(テキストとコールバック関数なし)です。 提案がありますか?tkinterクラスの構成が動作しません

import tkinter as tk 
import tkinter.ttk as ttk 

class Button(ttk.Button): 

    def __init__(self, parent): 
     super().__init__(parent) 

     self.item = ttk.Button(parent, text="Greet", command=self.greet) 

    def greet(self): 
     print("Greetings!") 

class App(): 

    def __init__(self, parent):   
     parent.title("A simple GUI") 

     self.label = ttk.Label(parent, text="A label") 
     self.greet = Button(parent) 
     self.button = ttk.Button(parent, text="Close", command=parent.quit) 

     self.label.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.greet.grid(row=1, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.button.grid(row=2, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 

     parent.grid_columnconfigure(0, weight=1)   

    def greet(self): 
     print("Greetings!") 

if __name__ == "__main__": 
    root = tk.Tk() 
    app = App(root) 
    root.mainloop() 
+0

_composition_を使用している場合は、 'ttk.Button'から継承するべきではありません。あなたのクラスは実際に2つのボタンを作成します。 –

+0

私はコンセプトについて学んでいるので、私はできますし、私はものについて間違っています。私が 'class Button():'のような 'ttk.Button'を継承しないと、あなたのコメントに関して、' builtins.TypeError:object .__ init __()はパラメータを受け取りません '? – flebas

答えて

1

新しいクラスは、ボタンです。ボタンを含む必要はありません。あなた(と他の人が)TKからクラスと混同しないように

class FlebasButton(ttk.Button): 
    def __init__(self, master): 
     super().__init__(master, text="Greet", command=self.greet) 

    def greet(self): 
     print("Greetings!") 

また、新しいクラスのための「ボタン」以外の名前を選択します。そして、tkinterは親クラスのために内部的に "master"を使用しているので、一般的にtkinterオブジェクトにも "master"を使う方が良いでしょう。

1

クラスのインスタンスButtonは実際にはテキストまたはコールバックのない一般的なボタンです。それぞれにはself.item属性を使用)が含まれていますが、パックしたりグリッド化したりすることがないため、実際には表示されません。

ttk.Button()コールに渡すパラメータは、基本的にsuper().__init__()コールで渡されるため、Buttonオブジェクト自体に影響します。