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

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

Существует множество инструментов, которые позволяют реализовать графический интерфейс в 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_html as 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 = getattr(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)
)

interactive_plot
<function __main__.plot(fname, omega, color, title, grid, fontsize)>