Python GUI: создание интерфейсов с нуля

Раздел: Разработка на Python -> графические интерфейсы

Основные библиотеки для Python GUI

Разработка графических интерфейсов (GUI) на Python охватывает разные задачи: от простых окон до сложных инструментов с графиками. Встроенный модуль Tkinter остаётся базовым выбором, однако существуют альтернативы, расширяющие возможности.

Tkinter: стандартный инструмент

Как создать базовое окно с кнопкой?

import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text='Нажми меня')
btn.pack()
root.mainloop()

Python gui (графические приложения python)

После вызова mainloop окно остаётся открытым. Метод pack размещает виджет. Основные менеджеры компоновки: pack, grid, place.

Ошибка: окно не появляется - забыт вызов mainloop().

Ошибка: виджеты накладываются - используется смешивание pack и grid внутри одного контейнера. Рекомендуется выбрать один менеджер.

Проблема блокировки: долгие операции замораживают интерфейс. Решение - вызов update() или использование потоков.

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

PyQt5 / PySide6 - мощные обёртки Qt. Сигналы и слоты упрощают обработку событий.

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
app = QApplication([])
window = QMainWindow()
btn = QPushButton('Кнопка')
window.setCentralWidget(btn)
window.show()
app.exec_()

Kivy python (фреймворк kivy)

Ошибка: ImportError - установите PyQt5 (pip install pyqt5) или PySide6.

Проблема: лицензирование - GPL требует использования LGPL (PySide) в коммерческих проектах.

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

Kivy - библиотека, работающая через OpenGL, поддерживает мультитач и сборку под Android.

from kivy.app import App
from kivy.uix.button import Button
class MyApp(App):
    def build(self):
        return Button(text='Hello')
MyApp().run()

программа на python с графическим интерфейсом (программа с графическим интерфейсом на python)

Ошибка: модуль не найден - выполните pip install kivy. На некоторых системах требуется дополнительная настройка окружения.

Проблема: медленный запуск из-за компиляции шейдеров; первый запуск может длиться дольше.

Как получить внешний вид, максимально близкий к системе?

wxPython использует нативные виджеты Windows, macOS, Linux.

import wx
app = wx.App()
frame = wx.Frame(None, title='Hello')
frame.Show()
app.MainLoop()

Ошибка: AttributeError при отсутствии установленной библиотеки - запустите pip install wxPython.

Проблема: сообщество меньше, чем у Tkinter, сложнее найти готовые решения.

Как быстро создать веб-интерфейс из Python?

Flet оборачивает Flutter, позволяя писать на Python и запускать в браузере или как настольное приложение.

import flet as ft
def main(page: ft.Page):
    page.add(ft.Text('Hello'))
ft.app(target=main)

Ошибка: при первом запуске требуется загрузка Flutter SDK - может отсутствовать офлайн.

Проблема: ограниченные возможности кастомизации по сравнению с прямым Flutter.

Как создать интерфейс для реального времени с графиками?

Dear PyGui - высокопроизводительная библиотека для инструментов анализа, с графиками и узловыми редакторами.

import dearpygui.dearpygui as dpg
dpg.create_context()
dpg.add_text('Hello')
dpg.create_viewport()
dpg.setup_dearpygui()
dpg.start_dearpygui()

Ошибка: нет модуля - установите pip install dearpygui. Версия может отличаться, проверьте документацию.

Проблема: внешний вид не соответствует теме ОС, требуется ручная стилизация.

Пример 1: Калькулятор на Tkinter

Этот пример демонстрирует сеточное размещение виджетов и обработку ввода с помощью eval.

Пример
import tkinter as tk

def calculate():
    try:
        result = eval(entry.get())
        label.config(text=str(result))
    except:
        label.config(text='Ошибка')

root = tk.Tk()
root.title('Калькулятор')
entry = tk.Entry(root)
entry.grid(row=0, column=0, columnspan=4)

buttons = ['7','8','9','/','4','5','6','*','1','2','3','-','0','.','=','+']
row = 1; col = 0
for btn_text in buttons:
    cmd = lambda t=btn_text: entry.insert(tk.END, t) if t != '=' else calculate()
    if btn_text == '=':
        btn = tk.Button(root, text=btn_text, command=cmd)
        btn.grid(row=row, column=col)
    else:
        btn = tk.Button(root, text=btn_text, command=cmd)
        btn.grid(row=row, column=col)
    col += 1
    if col > 3:
        col = 0
        row += 1

label = tk.Label(root, text='Результат')
label.grid(row=row, column=0, columnspan=4)
root.mainloop()
При запуске появляется окно с кнопками цифр и операций. После ввода выражения и нажатия '=' результат отображается под кнопками.

Пример 2: Таблица с данными в PyQt5

Создание таблицы с тремя строками с помощью QTableWidget.

Пример
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget

app = QApplication(sys.argv)
window = QMainWindow()
window.setWindowTitle('Таблица')
central = QWidget()
layout = QVBoxLayout(central)
table = QTableWidget()
table.setRowCount(3)
table.setColumnCount(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'))
layout.addWidget(table)
window.setCentralWidget(central)
window.show()
sys.exit(app.exec_())
Окно с таблицей, содержащей три строки. Столбцы 'Имя' и 'Возраст' заполнены.

Пример 3: Взаимодействие с кнопкой в Kivy

Кнопка меняет текст метки при нажатии. Демонстрация привязки событий.

Пример
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout

class MyApp(App):
    def build(self):
        layout = BoxLayout(orientation='vertical')
        self.label = Label(text='Нажмите кнопку')
        btn = Button(text='Нажми меня')
        btn.bind(on_press=self.on_button_press)
        layout.add_widget(self.label)
        layout.add_widget(btn)
        return layout
    def on_button_press(self, instance):
        self.label.text = 'Кнопка нажата!'

if __name__ == '__main__':
    MyApp().run()
Открывается окно с надписью и кнопкой. При клике текст метки изменяется.

Пример 4: Список задач на Flet

Простое веб-приложение, добавляющее текст из поля ввода в список.

Пример
import flet as ft

def main(page: ft.Page):
    tasks = []
    def add_task(e):
        if task_input.value:
            tasks.append(ft.Text(task_input.value))
            task_input.value = ''
            page.controls.clear()
            page.add(ft.Row([task_input, ft.ElevatedButton('Добавить', on_click=add_task)]))
            for t in tasks:
                page.add(t)
            page.update()
    task_input = ft.TextField(hint_text='Введите задачу')
    page.add(ft.Row([task_input, ft.ElevatedButton('Добавить', on_click=add_task)]))

ft.app(target=main)
В браузере (или окне) отображается поле ввода и кнопка. После нажатия введённый текст добавляется в список ниже.

Пример 5: График синуса в Dear PyGui

Построение простого графика с использованием встроенной поддержки серий.

Пример
import dearpygui.dearpygui as dpg
import math

dpg.create_context()
with dpg.window(label='График', width=400, height=300):
    x_data = [i * 0.1 for i in range(100)]
    y_data = [math.sin(x) for x in x_data]
    dpg.add_line_series(x_data, y_data, label='sin(x)')
    dpg.add_plot_axis(dpg.mvXAxis, label='x')
    dpg.add_plot_axis(dpg.mvYAxis, label='y')
    dpg.set_axis_limits(dpg.last_item(), -1.5, 1.5)
dpg.create_viewport(title='Dear PyGui')
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
Появляется окно с графиком синусоиды, осями и подписями.

графические приложения Python - comments

En
Python gui (python)