2017-02-20 15 views
0

Я ныряю в tkinter в настоящий момент, и многие примеры кода в Интернете охватывают только очень простые примеры и не учат передовым практикам.Структура tkinter program - Лучшие практики

Для лучшей ремонтопригодности и ясности я бы хотел использовать ООП для графического интерфейса, что имеет смысл с моей точки зрения. Однако я бы посоветовал, как его структурировать, потому что я новичок в целом. Я уже просматривал другие вопросы, но они не могли ответить на мой конкретный общий вопрос, который у меня есть.

Моя идея здесь:

Хотела создать строку меню для графического интерфейса и создать новый файл 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

ответ

0

Вложение класса не снижает и не увеличивает эффективность выполнения. Это может изменить эффективность обслуживания и понимания. Вложенные классы Python не похожи на Java, где вложенный класс, где внутренний класс может ссылаться на экземпляры внешнего класса. Они фактически являются двумя отдельными классами.

Таким образом, ваш пример 1 лучше, чем, например 2.

Смотрите также: