2017-02-20 28 views
0

私は現時点でtkinterに潜入しています。インターネット上の多くのコード例は、非常に簡単な例だけをカバーしており、ベストプラクティスを教えていません。構造体tkinterプログラム - ベストプラクティス

メンテナンス性と明瞭さを向上させるために、OOPをGUIに使用したいと思います。これは私の視点からは意味があります。 しかし、私は一般的な初心者ですので、構造化の方法についてあなたのアドバイスをしています。 私はすでに他の質問を閲覧しましたが、私の特定の一般的な質問には答えられませんでした。ここ

私の考え:

は、GUIのメニューバーを作成し、それだけでメニューを扱うmenu.pyを新しいファイルを作成したいと思います。ここでは、2つの例を見つけることができます。

1.例: 論理的には、メニューバーは他のメニューで構成されています。メニューにはメニューが含まれています。しかし、ネストされたクラスを使うのが良いのかどうかはわかりません。

import tkinter as tk 

class Menu(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     super().__init__(parent, *args, **kwargs) 
     self.parent = parent 
     self.menubar = Menubar(self) 

    class Menubar(tk.Menu): 
     def __init__(self, parent, *args, **kwargs): 
      super().__init__(parent, *args, **kwargs) 
      self.parent = parent 

      self.add_cascade(label="File", menu=self.file_menu) 
      self.add_cascade(label="Edit", menu=self.edit_menu) 

      self.file_menu = FileMenu(self) 
      self.edit_menu = EditMenu(self) 

     class FileMenu(tk.Menu): 
      def __init__(self, parent, *args, **kwargs): 
       super().__init__(parent, *args, **kwargs) 
       self.parent = parent 

     class EditMenu(tk.Menu): 
      def __init__(self, parent, *args, **kwargs): 
       super().__init__(parent, *args, **kwargs) 
       self.parent = parent 

2.例:ここでは、より多くの手続き例を見つけることができます。しかし、ここの弱点は、階層的なMenubarとfile_menuとedit_menuが同じレベルにあるということです。しかし、論理的には、Menubarはfile_menuとedit_menuで構成されています。だから、実際にはモジュラーではありません。反対側では、最初の例よりも読みやすいでしょうか?

import tkinter as tk 

class Menu(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     super().__init__(parent, *args, **kwargs) 
     self.parent = parent 
     self.menubar = tk.Menu(self) 

     self.create_file_menu(self.menubar) 
     self.create_edit_menu(self.menubar) 

    def create_file_menu(self, parent): 
     self.file_menu = tk.Menu(parent) 
     self.menubar.add_cascade(label="File", menu=self.file_menu) 

    def create_edit_menu(self, parent): 
     self.edit_menu = tk.Menu(parent) 
     self.menubar.add_cascade(label="Edit", menu=self.edit_menu) 
+0

は、あなたが宣言されていることを知っています内部のクラス別のクラス? – WhatsThePoint

+0

はい、これは私のテキストに書いてあります。 – Aliquis

+1

残念ながら、その部分は見えませんでしたが、必要なときにそれらを分けて呼び出すほうがよいでしょう – WhatsThePoint

答えて

0

クラスのネストは、実行効率を低下させず、また向上させません。メンテナンスや理解の効率が変わる可能性があります。 Pythonのネストされたクラスは、内部クラスが外部クラスのインスタンスを参照できるネストされたクラスのJavaのようなものではありません。彼らは事実上2つの別々のクラスです。

したがって、あなたの例1は、2

も参照例よりも優れている: