Я виступаю за об'єктно-орієнтований підхід. Це шаблон, з якого я починаю:
# Use Tkinter for python 2, tkinter for python 3
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
<create the rest of your GUI here>
if __name__ == "__main__":
root = tk.Tk()
MainApplication(root).pack(side="top", fill="both", expand=True)
root.mainloop()
Важливо помітити:
Я не використовую імпорт підстановки. Я імпортую пакунок як "tk", що вимагає попередньо встановити всі команди tk.
. Це запобігає забрудненню глобального простору імен, а також робить код абсолютно очевидним при використанні класів Tkinter, класів ttk або деяких власних.
Основний додаток - клас . Це дає вам приватний простір імен для всіх ваших зворотних дзвінків та приватних функцій, і просто в цілому полегшує організацію коду. У процедурному стилі ви повинні кодувати зверху вниз, визначаючи функції перед їх використанням тощо. За допомогою цього методу ви цього не робите, оскільки ви фактично не створюєте головне вікно до останнього кроку. Я вважаю за краще успадковувати tk.Frame
лише тому, що я зазвичай починаю зі створення кадру, але це аж ніяк не потрібно.
Якщо у вашому додатку є додаткові вікна на рівні рівнів, я рекомендую зробити кожен із них окремим класом, успадковуючи його tk.Toplevel
. Це дає всі ті ж переваги, про які було сказано вище - вікна атомні, у них є власний простір імен, і код добре організований. Крім того, це дозволяє легко вставити кожен у свій модуль, як тільки код починає набирати великі розміри.
Нарешті, ви можете розглянути можливість використання класів для кожної основної частини вашого інтерфейсу. Наприклад, якщо ви створюєте додаток за допомогою панелі інструментів, панелі навігації, панелі стану та основної області, ви можете зробити кожен з цих класів. Це робить ваш основний код досить малим і легким для розуміння:
class Navbar(tk.Frame): ...
class Toolbar(tk.Frame): ...
class Statusbar(tk.Frame): ...
class Main(tk.Frame): ...
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.statusbar = Statusbar(self, ...)
self.toolbar = Toolbar(self, ...)
self.navbar = Navbar(self, ...)
self.main = Main(self, ...)
self.statusbar.pack(side="bottom", fill="x")
self.toolbar.pack(side="top", fill="x")
self.navbar.pack(side="left", fill="y")
self.main.pack(side="right", fill="both", expand=True)
Оскільки всі ці екземпляри мають спільний батьківський контроль, батько фактично стає частиною "контролера" архітектури модельного перегляду та контролера. Так, наприклад, головне вікно може розмістити щось на панелі стану, зателефонувавши self.parent.statusbar.set("Hello, world")
. Це дозволяє визначити простий інтерфейс між компонентами, допомагаючи зберегти з’єднання до мінімуму.