Site icon 8HOST.COM

Продвинутый Tkinter: работа с классами

Если вы раньше работали с модулем 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, посетите эту страницу.