Python PyQt
PyQt es una potente biblioteca de Python para crear interfaces gráficas de usuario (GUI), que puede usarse como alternativa al Tkinter integrado de Python.
PyQt es la vinculación de Python al framework Qt, ampliamente utilizado en el desarrollo de aplicaciones de escritorio.
Qt es un framework de desarrollo de aplicaciones C++ multiplataforma.
PyQt permite a los desarrolladores de Python utilizar la biblioteca Qt para crear potentes aplicaciones GUI.
PyQt tiene las siguientes versiones principales:
- PyQt4: vinculación basada en Qt4
- PyQt5: vinculación basada en Qt5
- PyQt6: vinculación basada en Qt6 (última versión)
Instalar PyQt
Instalar PyQt5 con pip:
# 安装PyQt5 pip install PyQt5 # 安装Qt设计师和其他工具(可选) pip install PyQt5-tools
Primer programa PyQt
Crear una ventana simple
El siguiente es un programa PyQt básico que crea una ventana en blanco:
Ejemplo
# Crear la instancia de la aplicación
app = QApplication([])
# Crear la ventana principal
window = QWidget()
window.setWindowTitle("Mi primer programa PyQt")
window.setGeometry(100, 100, 400, 300) # (x, y, width, height)
# Mostrar la ventana
window.show()
# Ejecutar la aplicación
app.exec_()

Análisis del código
QApplicationGestiona el flujo de control y la configuración principal de las aplicaciones GUI.QWidgetLa clase de ventana más básica; todos los componentes de la interfaz de usuario heredan de ella.setWindowTitle()Establece el título de la ventana.setGeometry()Establece la posición y el tamaño de la ventana.show()Muestra la ventana.app.exec_()Inicia el bucle de eventos y espera la interacción del usuario.
Una aplicación PyQt típica consta de las siguientes partes:
- Objeto QApplicationCada aplicación PyQt necesita tener una instancia de QApplication.
- Ventanas y controlesComponentes de la interfaz de usuario
- Bucle de eventosBucle que procesa la entrada del usuario y los eventos del sistema
- Manejadores de eventosFunciones o métodos que responden a eventos
Ejemplo
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# Establecer el título y el tamaño de la ventana
self.setWindowTitle("Mi primera aplicación PyQt")
self.setGeometry(100, 100, 400, 300) # x, y, width, height
# Crear un botón
self.button = QPushButton("Haz clic", self)
self.button.setGeometry(150, 150, 100, 30)
self.button.clicked.connect(self.button_clicked)
def button_clicked(self):
print("¡Se hizo clic en el botón!")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

Componentes comunes de PyQt
Botón (QPushButton)
Ejemplo
button = QPushButton("Haz clic", window)
button.move(150, 150) # Establecer la posición del botón
Etiqueta (QLabel)
Ejemplo
label = QLabel("Hello PyQt!", window)
label.move(100, 100)
Campo de texto (QLineEdit)
Ejemplo
textbox = QLineEdit(window)
textbox.move(100, 50)
Para más contenido sobre componentes comunes, consulta:https://www.example.com/python3/python-pyqt-widgets.html
Gestión de diseño (QVBoxLayout)
Usar gestores de diseño permite ajustar automáticamente la posición de los componentes:
Ejemplo
layout = QVBoxLayout()
layout.addWidget(QLabel("Nombre de usuario"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("Iniciar sesión"))
window.setLayout(layout)
Para más contenido sobre gestión de diseños, consulta:https://www.example.com/python3/python-pyqt-layout.html
Mecanismo de señales y ranuras
PyQt usaseñal (Signal)yranura (Slot)el mecanismo para manejar eventos.
El mecanismo de señales y ranuras de PyQt es el mecanismo central para la comunicación entre objetos.
- Señal (Signal): notificación emitida cuando ocurre un evento específico.
- Ranura (Slot): función o método que responde a la señal.
Ejemplo
def on_button_click():
print("¡Se hizo clic en el botón!")
button = QPushButton("Haz clic", window)
button.clicked.connect(on_button_click) # Conectar señal y ranura
Señal personalizada
Ejemplo
class MyEmitter(QObject):
my_signal = pyqtSignal(str) # Definir una señal
emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f"Señal recibida: {x}"))
emitter.my_signal.emit("Hello") # Emitir la señal
Para más contenido sobre gestión de diseños, consulta:https://www.example.com/python3/python-pyqt-signals-and-slots.html
Usar Qt Designer
Qt Designer es una herramienta de diseño visual que permite diseñar interfaces arrastrando y soltando componentes:
- Iniciar Designer (normalmente en el directorio Lib\site-packages\qt5_applications\Qt\bin de la instalación de Python)
- Diseña la interfaz y guárdala como.uiarchivo
va a.uiConvierta el archivo a código Python:
pyuic5 input.ui -o output.py
Usar la interfaz generada en el código:
Ejemplo
# Cargar el archivo UI
Form, Window = uic.loadUiType("output.ui")
# Usar la UI
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())
Práctica: una aplicación simple de bloc de notas
Diseño de interfaz
Ejemplo
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
QAction, QFileDialog, QMessageBox)
class Notepad(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.text_edit = QTextEdit(self)
self.setCentralWidget(self.text_edit)
self.create_actions()
self.create_menus()
self.setWindowTitle('Bloc de notas simple')
self.setGeometry(100, 100, 800, 600)
def create_actions(self):
# Acciones del menú Archivo
self.new_action = QAction('Nuevo', self)
self.new_action.setShortcut('Ctrl+N')
self.new_action.triggered.connect(self.new_file)
self.open_action = QAction('Abrir', self)
self.open_action.setShortcut('Ctrl+O')
self.open_action.triggered.connect(self.open_file)
self.save_action = QAction('Guardar', self)
self.save_action.setShortcut('Ctrl+S')
self.save_action.triggered.connect(self.save_file)
self.exit_action = QAction('Salir', self)
self.exit_action.setShortcut('Ctrl+Q')
self.exit_action.triggered.connect(self.close)
# Acciones del menú Edición
self.copy_action = QAction('Copiar', self)
self.copy_action.setShortcut('Ctrl+C')
self.copy_action.triggered.connect(self.text_edit.copy)
self.paste_action = QAction('Pegar', self)
self.paste_action.setShortcut('Ctrl+V')
self.paste_action.triggered.connect(self.text_edit.paste)
self.cut_action = QAction('Cortar', self)
self.cut_action.setShortcut('Ctrl+X')
self.cut_action.triggered.connect(self.text_edit.cut)
def create_menus(self):
menubar = self.menuBar()
# Menú Archivo
file_menu = menubar.addMenu('Archivo')
file_menu.addAction(self.new_action)
file_menu.addAction(self.open_action)
file_menu.addAction(self.save_action)
file_menu.addSeparator()
file_menu.addAction(self.exit_action)
# Menú Edición
edit_menu = menubar.addMenu('Edición')
edit_menu.addAction(self.copy_action)
edit_menu.addAction(self.paste_action)
edit_menu.addAction(self.cut_action)
def new_file(self):
self.text_edit.clear()
def open_file(self):
filename, _ = QFileDialog.getOpenFileName(self, 'Abrir archivo')
if filename:
try:
with open(filename, 'r') as f:
self.text_edit.setText(f.read())
except Exception as e:
QMessageBox.warning(self, 'Error', f'No se puede abrir el archivo: {e}')
def save_file(self):
filename, _ = QFileDialog.getSaveFileName(self, 'Guardar archivo')
if filename:
try:
with open(filename, 'w') as f:
f.write(self.text_edit.toPlainText())
except Exception as e:
QMessageBox.warning(self, 'Error', f'No se puede guardar el archivo: {e}')
if __name__ == '__main__':
app = QApplication(sys.argv)
notepad = Notepad()
notepad.show()
sys.exit(app.exec_())

Componentes centrales de PyQt5
La mayoría de los componentes se encuentran en PyQt5.QtWidgets.
Las funciones avanzadas (como multimedia, red) pueden requerir otros módulos (por ejemplo, QtCore, QtGui, QtNetwork, etc.).
QListView/QTableView/QTreeView deben usarse con modelos de datos (como QStandardItemModel), lo que ofrece mayor flexibilidad.
Otras extensiones que se pueden instalar:
pip install PyQtWebEngine # 网页支持 pip install PyQtChart # 图表支持
| Categoría de componente | Nombre del componente | Módulo | Descripción |
|---|---|---|---|
| Componentes básicos de ventana | QWidget | QtWidgets | Clase base de todos los objetos de interfaz de usuario; puede usarse como ventana en blanco o contenedor. |
QMainWindow | QtWidgets | Marco de ventana principal; incluye barra de menús, barra de herramientas, barra de estado, etc. | |
QDialog | QtWidgets | Clase base de diálogo, utilizada para ventanas emergentes. | |
| Gestión de diseño | QVBoxLayout | QtWidgets | Gestor de diseño vertical |
QHBoxLayout | QtWidgets | Gestor de diseño horizontal | |
QGridLayout | QtWidgets | Gestor de diseño de cuadrícula | |
QFormLayout | QtWidgets | Gestor de diseño de formulario (pares de etiqueta + campo de entrada) | |
| Botones | QPushButton | QtWidgets | Botón normal |
QRadioButton | QtWidgets | Botón de opción | |
QCheckBox | QtWidgets | Casilla de verificación | |
QToolButton | QtWidgets | Botón de barra de herramientas (puede incluir icono) | |
| Controles de entrada | QLineEdit | QtWidgets | Campo de entrada de texto de una línea |
QTextEdit | QtWidgets | Editor de texto enriquecido de varias líneas (compatible con HTML) | |
QPlainTextEdit | QtWidgets | Editor de texto plano de varias líneas | |
QSpinBox | QtWidgets | Cuadro de ajuste numérico (entero) | |
QDoubleSpinBox | QtWidgets | Cuadro de ajuste numérico (coma flotante) | |
QComboBox | QtWidgets | Cuadro de selección desplegable | |
QDateEdit | QtWidgets | Selector de fecha | |
QTimeEdit | QtWidgets | Selector de hora | |
QDateTimeEdit | QtWidgets | Selector de fecha y hora | |
QSlider | QtWidgets | Barra deslizante (horizontal/vertical) | |
QDial | QtWidgets | Control de perilla circular | |
| Controles de visualización | QLabel | QtWidgets | Etiqueta de texto/imagen |
QLCDNumber | QtWidgets | Pantalla de dígitos LCD | |
QProgressBar | QtWidgets | Barra de progreso | |
QStatusBar | QtWidgets | Barra de estado (normalmente se usa paraQMainWindow) | |
| Contenedores | QGroupBox | QtWidgets | Cuadro de grupo (contenedor con título) |
QTabWidget | QtWidgets | Contenedor de pestañas | |
QStackedWidget | QtWidgets | Contenedor apilado (muestra un control hijo a la vez) | |
QScrollArea | QtWidgets | Contenedor de área de desplazamiento | |
QMdiArea | QtWidgets | Área MDI (interfaz de múltiples documentos) | |
| Lista/Tabla/Árbol | QListWidget | QtWidgets | Control de lista (con gestión de elementos) |
QTreeWidget | QtWidgets | Control de árbol | |
QTableWidget | QtWidgets | Control de tabla | |
QListView | QtWidgets | Vista de lista (requiere un modelo de datos) | |
QTableView | QtWidgets | Vista de tabla (requiere un modelo de datos) | |
QTreeView | QtWidgets | Vista de árbol (requiere un modelo de datos) | |
| Menú / Barra de herramientas | QMenuBar | QtWidgets | Barra de menús |
QMenu | QtWidgets | Menú (puede contener submenús y acciones) | |
QToolBar | QtWidgets | Barra de herramientas | |
QAction | QtWidgets | Acción (para elementos de menú, botones de barra de herramientas, etc.) | |
| Cuadro de diálogo | QFileDialog | QtWidgets | Cuadro de diálogo de selección de archivos |
QColorDialog | QtWidgets | Cuadro de diálogo de selección de color | |
QFontDialog | QtWidgets | Cuadro de diálogo de selección de fuente | |
QInputDialog | QtWidgets | Cuadro de diálogo de entrada (texto, números, etc.) | |
QMessageBox | QtWidgets | Cuadro de mensaje (advertencia, error, pregunta, etc.) | |
| Vista gráfica | QGraphicsView | QtWidgets | Marco de vista gráfica (para gráficos 2D) |
QGraphicsScene | QtWidgets | Escena gráfica (para usar en combinaciónQGraphicsViewcon) | |
| Otros componentes funcionales | QCalendarWidget | QtWidgets | Control de calendario |
QSplashScreen | QtWidgets | Pantalla de inicio | |
QSystemTrayIcon | QtWidgets | Icono de bandeja del sistema | |
QWebEngineView | QtWebEngineWidgets | Componente de navegador web (debe instalarse por separadoPyQtWebEngine) |