Инструменты разработки GUI в Python: выбор и практические примеры

Раздел: Разработка на Python -> Разработка GUI

Обзор библиотек GUI для Python

Как создать полноценное настольное приложение с профессиональным интерфейсом?

Наиболее эффективным решением для сложных проектов считается библиотека PyQt6 (или её открытый аналог PySide6). Она предоставляет богатый набор виджетов, поддержку стилей, работу с базами данных и многопоточность.

Установка:

pip install PyQt6

Python gui библиотеки (библиотеки для создания gui в python)

Пример простого окна с кнопкой:


import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Моё приложение")
        self.setGeometry(100, 100, 400, 300)
        layout = QVBoxLayout()
        button = QPushButton("Нажми меня")
        button.clicked.connect(self.on_click)
        layout.addWidget(button)
        self.setLayout(layout)

    def on_click(self):
        print("Кнопка нажата")

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
  

Пояснение: создаётся класс окна, наследующий QWidget. В конструкторе устанавливаются заголовок и размеры. Кнопка связывается с методом on_click через сигнал clicked. Приложение запускается через QApplication.

Типичные ошибки:

  • Не вызван exec() - приложение завершится сразу.
  • Забыли установить layout - виджеты не появятся.
  • Лицензионные ограничения PyQt (GPL) требуют открытия исходного кода производных продуктов. Для коммерции лучше использовать PySide6 (LGPL).

Как сделать простой интерфейс без установки сторонних библиотек?

Tkinter входит в стандартную поставку Python. Подходит для быстрых прототипов и учебных проектов.


import tkinter as tk
root = tk.Tk()
root.title("Привет")
label = tk.Label(root, text="Hello, World!")
label.pack()
root.mainloop()
  

Запускается главный цикл mainloop(). Виджеты размещаются через pack(), grid() или place().

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

Как создать кроссплатформенное приложение с современным интерфейсом?

wxPython использует нативные виджеты каждой ОС, что придаёт приложению родной вид.


import wx
app = wx.App()
frame = wx.Frame(None, title="Пример wx", size=(400,300))
panel = wx.Panel(frame)
btn = wx.Button(panel, label="Жми", pos=(50,50))
frame.Show()
app.MainLoop()
  

Требуется установка pip install wxPython. Код похож на Tkinter, но более нативен.

Как сделать GUI для мобильных и сенсорных устройств?

Kivy ориентирован на мультитач и работает на Android, iOS, Windows, Linux.


from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello, Kivy')

TestApp().run()
  

Требуется pip install kivy. Стили задаются через KV-язык или кода. Подходит для игр и сенсорных интерфейсов.

Как интегрировать веб-технологии в настольное приложение?

Библиотека Dear PyGui использует GPU для рендеринга и позволяет быстро создавать инструменты с продвинутой визуализацией.


import dearpygui.dearpygui as dpg

dpg.create_context()
with dpg.window(label="Пример"):
    dpg.add_button(label="Клик", callback=lambda: print("Клик"))
dpg.create_viewport(title='DPG', width=600, height=400)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
  

Установка: pip install dearpygui. Отличается собственным циклом событий и контекстом.

Расширенные примеры использования библиотек GUI

Ниже приведены более сложные сценарии, демонстрирующие возможности разных библиотек.

Пример 1: Таблица с редактированием в PyQt6

Пример

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget

class TableWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Таблица")
        table = QTableWidget(3, 2)
        table.setHorizontalHeaderLabels(["Имя", "Возраст"])
        table.setItem(0, 0, QTableWidgetItem("Анна"))
        table.setItem(0, 1, QTableWidgetItem("25"))
        table.setItem(1, 0, QTableWidgetItem("Пётр"))
        table.setItem(1, 1, QTableWidgetItem("30"))
        table.setItem(2, 0, QTableWidgetItem("Мария"))
        table.setItem(2, 1, QTableWidgetItem("22"))
        self.setCentralWidget(table)

app = QApplication(sys.argv)
window = TableWindow()
window.show()
sys.exit(app.exec())

Результат:

Отображается окно с таблицей 3x2, ячейки можно редактировать двойным кликом.

Пример 2: Ввод данных и обработка в Tkinter

Пример

import tkinter as tk
from tkinter import messagebox

def greet():
    name = entry.get()
    if name:
        messagebox.showinfo("Привет", f"Здравствуйте, {name}!")
    else:
        messagebox.showwarning("Ошибка", "Введите имя")

root = tk.Tk()
root.title("Приветствие")
tk.Label(root, text="Ваше имя:").pack()
entry = tk.Entry(root)
entry.pack()
btn = tk.Button(root, text="OK", command=greet)
btn.pack()
root.mainloop()

Результат:

При вводе имени и нажатии OK появляется информационное окно с приветствием.

Пример 3: Анимация с Kivy (качающийся шарик)

Пример

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.animation import Animation

class Ball(Widget):
    pass

class BallApp(App):
    def build(self):
        ball = Ball()
        anim = Animation(center_y=400, duration=2) + Animation(center_y=100, duration=2)
        anim.repeat = True
        anim.start(ball)
        return ball

BallApp().run()

Результат:

Шарик (круглый виджет) плавно перемещается вверх-вниз в окне Kivy.

Пример 4: Многопоточная загрузка с wxPython

Пример

import wx
import threading
import time

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="Загрузка")
        self.gauge = wx.Gauge(self, range=100, size=(200, 30))
        self.btn = wx.Button(self, label="Старт")
        self.btn.Bind(wx.EVT_BUTTON, self.on_start)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.gauge, 0, wx.ALL, 10)
        sizer.Add(self.btn, 0, wx.ALL, 10)
        self.SetSizer(sizer)

    def on_start(self, event):
        self.btn.Disable()
        thread = threading.Thread(target=self.do_work)
        thread.start()

    def do_work(self):
        for i in range(101):
            time.sleep(0.05)
            wx.CallAfter(self.gauge.SetValue, i)
        wx.CallAfter(self.btn.Enable)

app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop()

Результат:

После нажатия кнопки прогресс-бар заполняется за 5 секунд, кнопка блокируется до завершения.

Пример 5: Встроенный веб-браузер с PyQt6

Пример

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.QtWebEngineWidgets import QWebEngineView

class Browser(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Браузер")
        self.browser = QWebEngineView()
        self.browser.setUrl("https://www.python.org")
        self.setCentralWidget(self.browser)

app = QApplication(sys.argv)
window = Browser()
window.show()
sys.exit(app.exec())

Результат:

Открывается окно, внутри которого отображается сайт python.org с полной поддержкой JavaScript.

Требуется установка модуля PyQt6-WebEngine.

Библиотеки для создания GUI в Python - comments

En
Python gui библиотеки (python)