Поиск по сайту:

Расширенный Tkinter: работа с классами


Сегодня мы будем работать с классами в Tkinter. Если вы раньше работали с Tkinter, вы, вероятно, знаете, что существует множество функций графического интерфейса, которые вы можете использовать для создания приложения.

Но при создании приложений вы быстро понимаете, что в модуле есть нечто большее, чем кажется на первый взгляд.

В tkinter есть много скрытых функций, и одна из них — метод использования классов в модуле.

Настройка модуля Tkinter

Нет необходимости устанавливать какой-либо модуль, так как модуль tkinter является частью стандартной библиотеки Python.

Однако в этой статье речь пойдет о немного продвинутой форме модуля tkinter, поэтому рекомендуется пройти серию для начинающих.

Поэтому, прежде чем двигаться дальше, не забудьте прочитать основные руководства по TKinter здесь:

  • Ткинтер, часть 1
  • Ткинтер, часть 2
  • Ткинтер, часть 3

Если вы закончили с основными руководствами, давайте приступим к работе с модулем tkinter.

Чтобы работать с классами, нам нужно импортировать модуль tkinter.

# Importing the tkinter module
import tkinter as tk

# Used for styling the GUI
from tkinter import tkk

Мы также будем импортировать пакет ttk отдельно для простоты использования.

Работа с классами в Tkinter

Давайте разберемся, как работать с классами в Tkinter. Принцип работы приложения довольно прост.

Сначала мы создаем корневое окно, поверх которого помещаем один кадр.

Чтобы оно выглядело как приложение с разными окнами, мы также создадим функцию, которая переключается с одного кадра на другой.

Это дает пользователю иллюзию, что он перенаправляется на другое окно/вкладку, но на самом деле просто переключается между кадрами.

Мы будем работать с фреймами 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 открывает множество возможностей для работы и создания новых приложений.

Сегодня мы работали над довольно большим количеством кода, и, поскольку мы находимся на одной странице, вот суть!

Если вы хотите посмотреть на живой пример, посмотрите мой проект SQLite3.

Рекомендации

  • Документация по Tkinter
  • Классы Tkinter