Если вы раньше работали с модулем Tkinter, вы, вероятно, знаете, что в нем существует множество функций графического интерфейса, которые можно использовать для создания приложения.
Однако на практике быстро становится ясно, что в модуле есть гораздо больше полезного, чем кажется на первый взгляд.
В tkinter есть много скрытых функций, и одна из них — метод использования классов. Сегодня мы поработаем с классами в Tkinter.
Настройка модуля Tkinter
Устанавливать что-либо дополнительно нет никакой необходимости, так как модуль tkinter является частью стандартной библиотеки Python.
Читайте также: Основы Python: как работают классы и объекты
Чтобы работать с классами, нам нужно импортировать модуль tkinter.
# Importing the tkinter module import tkinter as tk # Used for styling the GUI from tkinter import tkk
Как видите, мы также отдельно импортировали пакет ttk для простоты использования.
Работа с классами в Tkinter
Итак, давайте разберемся, как работать с классами в Tkinter. Принцип работы приложения довольно прост.
Сначала мы создаем корневое окно (root window), поверх которого помещаем один фрейм (frame, или рамка).
Чтобы это выглядело как приложение с разными окнами, давайте также создадим функцию, которая переключается с одного фрейма на другой. Так мы создадим для пользователя иллюзию, что он перенаправляется на другое окно/вкладку, но на самом деле он будет просто переключаться между фреймами.
Фреймы, с которыми мы будем работать, – это MainPage, SidePage и CompletionScreen.
Для переключения между ними мы будем использовать метод show_frame().
Написание кода
Для начала давайте создадим базовый класс, из которого мы будем обращаться ко всем остальным классам/фреймам.
# Allowing us to extend from the Tk class class testClass(tk.Tk):
Расширение класса tk.Tk позволяет нам работать с компонентами, присутствующими в классе Tk().
1: Инициализация классов
Чтобы инициализировать класс, мы используем функцию __init__. Она создает метод, который запускается сам по себе при формировании объекта из класса.
Аналогичным образом мы инициализируем класс через tk.Tk __init__.
import tkinter as tk from tkinter import ttk class windows(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) # Adding a title to the window self.wm_title("Test Application") # creating a frame and assigning it to container container = tk.Frame(self, height=400, width=600) # specifying the region where the frame is packed in root container.pack(side="top", fill="both", expand=True) # configuring the location of the container using grid container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) # We will now create a dictionary of frames self.frames = {} # we'll create the frames themselves later but let's add the components to the dictionary. for F in (MainPage, SidePage, CompletionScreen): frame = F(container, self) # the windows class acts as the root window for the frames. self.frames[F] = frame frame.grid(row=0, column=0, sticky="nsew") # Using a method to switch frames self.show_frame(MainPage)
2: Создание метода для переключения фреймов
Теперь, когда мы создали __init__, а также указали, какие фреймы мы собираемся использовать, мы можем создать метод, который переключает просматриваемые фреймы.
def show_frame(self, cont): frame = self.frames[cont] # raises the current frame to the top frame.tkraise()
3: Создание нескольких классов для фреймов
Теперь давайте создадим разные классы, действующие как фреймы, которые переключаются с помощью метода show_frame().
class MainPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = tk.Label(self, text="Main Page") label.pack(padx=10, pady=10) # We use the switch_window_button in order to call the show_frame() method as a lambda function switch_window_button = tk.Button( self, text="Go to the Side Page", command=lambda: controller.show_frame(SidePage), ) switch_window_button.pack(side="bottom", fill=tk.X) class SidePage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = tk.Label(self, text="This is the Side Page") label.pack(padx=10, pady=10) switch_window_button = tk.Button( self, text="Go to the Completion Screen", command=lambda: controller.show_frame(CompletionScreen), ) switch_window_button.pack(side="bottom", fill=tk.X) class CompletionScreen(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) label = tk.Label(self, text="Completion Screen, we did it!") label.pack(padx=10, pady=10) switch_window_button = ttk.Button( self, text="Return to menu", command=lambda: controller.show_frame(MainPage) ) switch_window_button.pack(side="bottom", fill=tk.X)
Обратите внимание, эти классы добавляются к основному классу с помощью переменной self.frames.
Хранить команды для реализации классов мы будем в __name__==”main”, но их можно использовать и напрямую.
if __name__ == "__main__": testObj = windows() testObj.mainloop()
Что дальше?
Итак, мы закончили с определением классов и методов и можем запустить этот скрипт.
Он должен предоставить вам крошечное окно, которое позволяет переключаться между фреймами одним нажатием кнопки.
На более высоком уровне вы даже можете создать функцию переключения между фреймами в строке меню в верхней части приложения.
Заключение
Работа с классами в модуле tkinter открывает много возможностей при создании новых приложений.
В этом мануале мы рассмотрели довольно большое количество кода, найти который можно также по этой ссылке.
Если же вы хотите посмотреть на живой пример, который реализует множество функций Tkinter, включая классы, и работает на SQLite3, посетите эту страницу.