Создание графических интерфейсов

16. Создание графических интерфейсов #

Создание графических интерфейсов (GUI) в Python позволяет разрабатывать приложения с визуальным взаимодействием с пользователем. Python поддерживает несколько библиотек для разработки GUI, таких как Tkinter, PyQt/PySide, а также интеграцию с веб-интерфейсами.


16.1. Tkinter #

Tkinter — стандартная библиотека Python для разработки GUI. Она простая в использовании и не требует установки.

Основные компоненты Tkinter #

  1. Окна (Tk).
  2. Виджеты (кнопки, метки, поля ввода).
  3. Менеджеры размещения (pack, grid, place).

Пример: базовое окно с кнопкой #

import tkinter as tk

def on_click():
    label.config(text="Кнопка нажата!")

# Создание окна
root = tk.Tk()
root.title("Пример Tkinter")

# Виджеты
label = tk.Label(root, text="Привет, мир!")
label.pack()

button = tk.Button(root, text="Нажми меня", command=on_click)
button.pack()

# Запуск приложения
root.mainloop()

Расширенный пример: калькулятор #

import tkinter as tk

def calculate():
    try:
        result = eval(entry.get())
        label_result.config(text=f"Результат: {result}")
    except Exception as e:
        label_result.config(text="Ошибка")

# Окно
root = tk.Tk()
root.title("Калькулятор")

# Поле ввода
entry = tk.Entry(root)
entry.pack()

# Кнопка
button = tk.Button(root, text="Вычислить", command=calculate)
button.pack()

# Результат
label_result = tk.Label(root, text="Результат:")
label_result.pack()

root.mainloop()

16.2. PyQt/PySide #

PyQt и PySide — это мощные библиотеки для создания сложных GUI на основе фреймворка Qt. Они требуют предварительной установки.

Установка #

pip install pyqt5

или

pip install pyside6

Пример: базовое окно с кнопкой #

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLabel

def on_click():
    label.setText("Кнопка нажата!")

app = QApplication([])

# Главное окно
window = QWidget()
window.setWindowTitle("Пример PyQt")

layout = QVBoxLayout()

label = QLabel("Привет, мир!")
layout.addWidget(label)

button = QPushButton("Нажми меня")
button.clicked.connect(on_click)
layout.addWidget(button)

window.setLayout(layout)
window.show()

app.exec_()

Расширенный пример: текстовый редактор #

from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QAction, QFileDialog

class TextEditor(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Текстовый редактор")

        # Текстовое поле
        self.text_edit = QTextEdit()
        self.setCentralWidget(self.text_edit)

        # Меню
        menu = self.menuBar().addMenu("Файл")
        open_action = QAction("Открыть", self)
        open_action.triggered.connect(self.open_file)
        menu.addAction(open_action)

        save_action = QAction("Сохранить", self)
        save_action.triggered.connect(self.save_file)
        menu.addAction(save_action)

    def open_file(self):
        filename, _ = QFileDialog.getOpenFileName(self, "Открыть файл")
        if filename:
            with open(filename, "r") as file:
                self.text_edit.setText(file.read())

    def save_file(self):
        filename, _ = QFileDialog.getSaveFileName(self, "Сохранить файл")
        if filename:
            with open(filename, "w") as file:
                file.write(self.text_edit.toPlainText())

app = QApplication([])
editor = TextEditor()
editor.show()
app.exec_()

16.3. Интеграция с веб-интерфейсами #

Веб-интерфейсы — популярный способ создания GUI, поскольку они работают в браузере и не зависят от платформы.

Flask + HTML для GUI #

Использование Flask позволяет создать серверное приложение с веб-интерфейсом.

Установка #
pip install flask
Пример: простое веб-приложение #
from flask import Flask, render_template, request

app = Flask(__name__)

@app.route("/")
def index():
    return render_template("index.html")

@app.route("/submit", methods=["POST"])
def submit():
    name = request.form.get("name")
    return f"Привет, {name}!"

# HTML (index.html)
"""
<!DOCTYPE html>
<html>
<head>
    <title>Пример Flask</title>
</head>
<body>
    <form action="/submit" method="post">
        <input type="text" name="name" placeholder="Введите имя">
        <button type="submit">Отправить</button>
    </form>
</body>
</html>
"""

if __name__ == "__main__":
    app.run(debug=True)

Использование библиотеки PyWebIO #

PyWebIO позволяет создавать интерактивные веб-приложения без необходимости написания HTML или CSS.

Установка #
pip install pywebio
Пример #
from pywebio.input import input, TEXT
from pywebio.output import put_text
from pywebio import start_server

def main():
    name = input("Введите ваше имя:", type=TEXT)
    put_text(f"Привет, {name}!")

start_server(main, port=8080)

Рекомендации #

  1. Tkinter подходит для создания простых и кроссплатформенных приложений.
  2. Используйте PyQt/PySide для разработки сложных приложений с профессиональным интерфейсом.
  3. Веб-интерфейсы (Flask, PyWebIO) удобны для распределенных систем или приложений, работающих через браузер.