2017-02-20 145 views
0

我潛入tkinter此刻,互聯網上的許多代碼示例僅涵蓋非常簡單的示例,並不教授最佳實踐。結構tkinter程序 - 最佳實踐

爲了更好的可維護性和清晰度,我想將OOP用於GUI,這從我的角度來看是有意義的。 但是,我會就如何構建它提出建議,因爲我是一般初學者。 我已經瀏覽了其他問題,但他們無法回答我的具體一般問題。

我的想法在這裏:

想創建圖形用戶界面菜單欄,並創建一個新的文件menu.py,只有與該菜單的交易。在這裏您可以找到兩個示例:

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

是你知道你正在聲明o內的一個班級f另一班? – WhatsThePoint

+0

是的,我在文中寫到了這個。 – Aliquis

+1

對不起,沒有看到這個部分,但是最好將它們分開並在需要的時候調用它們 – WhatsThePoint

回答