Python GUI: создание интерфейсов с нуля
Основные библиотеки для 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()
Появляется окно с графиком синусоиды, осями и подписями.