2017-09-13 21 views
2

私はTkinterアプリを持っています。フレーム内にいくつかのボタンを入れて、このフレームをメインウィンドウに配置したいと思っています。Tkinter - ボタンを含むクラス

ただし、コードを実行すると空のウィンドウが返されます。私は、このように私は欠場か疑問

import Tkinter as tk 

class MainApplication(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 
     self.navbar = NavBar(self) 
     self.navbar.grid(row=0, column=0) 

class NavBar(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.parent = parent 
     self.fetchDataBtn = tk.Button(self, text='Fetch data') 
     self.filterDataBtn = tk.Button(self, text='Filter data') 

     self.fetchDataBtn.pack(padx=5, pady=10, side=tk.LEFT) 
     self.filterDataBtn.pack(padx=5, pady=20, side=tk.LEFT) 

def main(): 
    root = tk.Tk() 
    app = MainApplication(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

:だから私は原子コードがある..私は、モジュール式のクラスでTkinterアプリを構築するために、完全にどのように欠場と思います。私は検索しましたが、重複を見つけることができません..(彼らがいくつかの場合は、あなたが指摘してトピックを閉じるでしょう)。

NB:私は、Python 2.7.10を使用しています

答えて

5

MainApplicationインスタンスをパック(またはグリッドまたは配置)しないという問題があります。 MainApplicationtk.Frameクラスを継承しているため、そのインスタンスはウィジェットであるため、マスターにパックする必要があります。

def main(): 
    root = tk.Tk() 
    app = MainApplication(root)  <--- here: where does it go in the root? 
    root.mainloop() 

パックば、それは動作します:

app.pack() 
+0

私の好みは、クラスの外で 'init'I/Oの後に' pack() 'することです。 –

+0

@ReblochonMasqueそうすることに伴う問題は、インスタンスの配置方法を制御できなくなることです。代わりに 'grid'を使いたいのですが?たとえば、同じウィジェットの4つのインスタンスを正方形として配置するとします。彼らの共通の '__init__'の最後には何を書いていますか? –

+0

ありがとう、私はルートに自分のフレームを見つけることとのポイントを完全に逃した... –

1
あなたは pack、または gridを使用して、親フレームにナビゲーションバーを置く必要があり

:最初の間違いを指摘し@RightLegに

import Tkinter as tk 

class MainApplication(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 
     self.navbar = NavBar(self) 
     self.navbar.grid(row=0, column=0) 
     self.pack()    # <-- here --------- 

class NavBar(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.parent = parent 
     self.fetchDataBtn = tk.Button(self, text='Fetch data') 
     self.filterDataBtn = tk.Button(self, text='Filter data') 

     self.fetchDataBtn.pack(padx=5, pady=10, side=tk.LEFT) 
     self.filterDataBtn.pack(padx=5, pady=20, side=tk.LEFT) 

def main(): 
    root = tk.Tk() 
    app = MainApplication(root) 
    # app.pack() # <-- or here for a better control of the placement of several instances 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

クレジット。

+0

だから、なぜでしょうか? –

+0

どこに行けばいいですか? –

+0

問題はあなたが説明しているものではありません。確かに、これは問題を "解決"しますが、論理はここにはありません。 navbarの親**は** MainApplicationインスタンスであり、後者の親ではありません。そのロジックによれば、すべてのウィジェットの親はルートでなければなりません...問題は(私の答えをチェックしてください)、 'MainApplication'インスタンスを他のウィジェットとしてパックする必要があるということです。 OPのコードがうまくいかなかった理由は、 'app.pack()'(あるいは 'app.grid()')の呼び出しが不足していたからです。 –

関連する問題