Графический пользовательский интерфейс

Библиотеки для разработки графического интерфейса

Существует множество инструментов, которые позволяют реализовать графический интерфейс в python. Среди них особняком стоит модуль встроенной библиотеки tkinter: tkinter входит в стандартный дистрибутив CPython, а значит его использование не приводит к раздуванию зависимостей проекта.

Остальные средства разработки графического интерфейса представлены в виде сторонних библиотек. Они, часто, предоставляют более функциональные и удобные инструменты нежели tkinter, но добавляют зависимостей к проекту, а также нередко требуют следовать лицензионному соглашению. Таких библиотек очень много, среди них:

Здесь пойдет речь о Qt.

PySide vs PyQt

Есть два распространенных расширения Qt для Python: PtQt и PySide. PyQt появился раньше и долгое время опережал PySide. На сегодня это отставание полностью сократилось (более того, PySide6 вышел на месяц раньше PyQt6). Существование двух расширений объясняется различием в лицензировании: PySide распространяется под всеми теми же лицензиями, что и сам Qt (более того, его разрабатывает та же компания), а PyQt с несколько другим набором вариантов лицензирования.

С точки зрения кода обе библиотеки почти эквиваленты. Оба расширения переносят имена объектов из C++ в python без изменений. Миграция в обе стороны требует минимальных правок.

Далее везде речь пойдет о PySide6, но большинство утверждений и примеров останутся корректными, если заменить в них PySide на PyQt.

Элементы графического интерфейса в Jupyter

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

Библиотека ipywidgets позволяет добавлять элементы графического интерфейса прямо в Jupyter ноутбуке. С помощью этого инструмента можно быстро настроить интерактивное взаимодействие с кодом в блокноте. Например, это может быть полезно, чтобы пощупать какую-нибудь параметрическую модель: интерактивно изменяя параметры (например, ползунком), можно составить представления о том, как они влияют на модель.

В качестве примера ниже приводится код, который предоставляет интерактивный интерфейс к построению графика функции \(y=f(\omega x)\):

  • выбор функции \(f\),

  • значение параметра функции \(\omega\)

  • выбор цвета линии,

  • текст заголовка графика,

  • вывод сетки,

  • размера шрифта.

Note

Элементы графического интерфейса будут отображаться на сайте, но взаимодействие с ними не будет ни к чему приводить, т.к. на фоне нет запущенного ядра python. Чтобы попробовать пример, установите ipywidgets запустите этот код в jupyter ноутбуке.

from IPython.display import display
from ipywidgets import interact
import ipywidgets as widgets

import numpy as np
from matplotlib import pyplot as plt

def plot(fname, omega, color, title, grid, fontsize):
    plt.rcParams.update({"font.size":fontsize})
    
    x = np.linspace(0, 2 * np.pi, 200)
    fig, ax = plt.subplots(figsize=(10, 9))
    ax.set_ylim(-1, 1)
    ax.set_xlabel("$x$")
    ax.set_ylabel("$y$")
    
    f = eval(f"np.{fname}")
    y = f(omega * x)
    ax.plot(x, y, label=fname, color=color)

    ax.set_title(title)
    if grid:
        ax.grid()

interactive_plot = interact(plot,
         fname=["sin", "cos"],
         omega=widgets.FloatSlider(min=1., max=4., value=1.), 
         color=widgets.ColorPicker(concise=False, description='pick a color', value='blue'),
         title=widgets.Text(value="Interactive plot", placeholder="type the title",
         disription="String:"),
         grid=widgets.Checkbox(),
         fontsize=widgets.IntSlider(min=12, max=36, step=2, value=18)
        )