2016-05-11 11 views
0

複雑なダイアログ(10個以上のウィジェットを持つダイアログ、特に複数のフレームなどに配置されたダイアログ)を実装する場合、作成には多くのtkinter呼び出しが必要となり、 1つのメソッド内に保持されている場合は、読み込みと保守が困難です。一般的に、短い関数/メソッドは通常は長いものよりも優先されます。 Python、tkinter、複雑なダイアログとコード構造

import tkinter as tk 

class Dialog: 
    def __init__(self, master): 
     self.__master = master 
     self.create_gui(master) 

    def create_gui(self, frame, title = None): 
     if title: frame.title(title) 

     group_a = self.create_group_a(frame) 
     group_a.grid(row=0, column=0, sticky="nsew") 

     group_b = self.create_group_b(frame) 
     group_b.grid(row=1, column=0, sticky="nsew") 

     frame.columnconfigure(0, weight=1) 
     frame.rowconfigure(0, weight=1) 
     frame.rowconfigure(1, weight=1) 

    def create_group_a(self, frame): 
     inner_frame = tk.LabelFrame(frame, text="Label") 
     text = self.create_text_with_scrollbar(inner_frame) 
     text.pack(fill="both") 
     return inner_frame 

    def create_group_b(self, frame): 
     button = tk.Button(frame, text="Button") 
     return button 

    def create_text_with_scrollbar(self, frame): 
     text_frame = tk.Frame(frame) 
     text_frame.grid_rowconfigure(0, weight=1) 
     text_frame.grid_columnconfigure(0, weight=1) 

     text = tk.Text(text_frame) 
     text.grid(row=0, column=0, sticky="nsew") 

     scrollbar = tk.Scrollbar(text_frame, command=text.yview) 
     scrollbar.grid(row=0, column=1, sticky="nsew") 
     text['yscrollcommand'] = scrollbar.set 

     return text_frame 


if __name__ == "__main__": 
    master = tk.Tk() 
    Dialog(master) 
    tk.mainloop() 

が任意の特定があります:メソッドの長さを制限する

私の現在のアプローチは、このようなトップレベルのウィジェットを返す1 method(parent_frame, other_options)にダイアログ内のグループに属しているすべてのウィジェットの作成をカプセル化することですそのような場合のコード構造に関するガイドラインは?誰もそのようなコードをより良く構築する方法についてアドバイスをしていますか?

答えて

2

私が通常行っていることは、すべてのグループに新しいクラスを書くことです。 これらのクラスはFrameから継承します。 最終結果は次のようになります。

class MainFrame(Frame): 
    def __init__(self, *args, **kwargs): 
     super().__init__(self, *args, **kwargs) 
     self.first_sub = FirstSubFrame(self) 
     self.second_sub = SecondSubFrame(self) 

     self.first_sub.grid() 
     self.second_sub.grid() 


class FirstSubFrame(Frame): 
    def __init__(self, *args, **kwargs): 
     super().__init__(self, *args, **kwargs) 
     self.possibly_another_subframe = PossibleOtherFrame(self) 
     self.awesome_button = tkinter.Button() 

     self.possibly_another_subframe.grid() 
     self.awesome_button.grid() 

... 

これが役立ちます。

+0

ありがとうございます! Brian OakleyもTkinterクラスからクラスを継承しています(http://stackoverflow.com/questions/17466561/best-way-to-structure-a-tkinter-application)。しかし、彼の答え(Shuleから)には、Frameなどを継承せず、フレームメンバーを持っている方がよい場合があるというコメントがあります。私の直感は同じことを私に伝えていますが、理由を説明することはできません。これは最初に質問をする1つの理由でした。私は質問を更新します。 – Robin

+0

いいえ、私は質問を更新しません。 「tkinterクラスから継承するかどうか」という質問は、それまでに議論されてきたトピックです。ここ:http://stackoverflow.com/questions/7300072/inheriting-from-frame-or-not-in-a-tkinter-application。 – Robin

関連する問題