PyQt5 es una de las bibliotecas GUI más avanzadas para Python. Si bien es poderoso, también está bien estructurado y facilita la creación de elementos «avanzados». Los widgets personalizados en PyQt5 son muy sencillos.
El siguiente tiene una forma bien descrita de crear widgets personalizados con PyQt5,
La ventana principal
Empecemos por crear nuestra ventana principal. Vamos por la ruta OOP desde el principio. Una forma sin programación orientada a objetos es un dolor para el mantenimiento. Nuestro esqueleto se ve así.
import sys from PyQt5 import QtWidgets from PyQt5 import QtCore from PyQt5 import QtGui class MainWindow(QtWidgets.QMainWindow): def __init__(self, parent = None): super().__init__(parent) self.init_gui() def init_gui(self): self.window = QtWidgets.QWidget() self.layout = QtWidgets.QGridLayout() self.setCentralWidget(self.window) self.window.setLayout(self.layout) if __name__ == '__main__': app = QtWidgets.QApplication([]) win = MainWindow() win.show() sys.exit(app.exec_())
a qué salidas
Una aplicación normal
Agreguemos un cuadro de texto y una etiqueta que solo haga eco de lo que escribamos.
Nuestra ventana principal se convierte en esto:
class MainWindow(QtWidgets.QMainWindow): def __init__(self, parent = None): super().__init__(parent) self.init_gui() def init_gui(self): self.window = QtWidgets.QWidget() self.layout = QtWidgets.QGridLayout() self.setCentralWidget(self.window) self.window.setLayout(self.layout) self.textbox = QtWidgets.QLineEdit() self.echo_label = QtWidgets.QLabel('') self.textbox.textChanged.connect(self.textbox_text_changed) self.layout.addWidget(self.textbox, 0, 0) self.layout.addWidget(self.echo_label, 1, 0) def textbox_text_changed(self): self.echo_label.setText(self.textbox.text())
a qué salidas
Esqueleto de widget
Un widget vacío se ve así:
class MyWidget(QtWidgets.QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.layout = QtWidgets.QGridLayout() self.setLayout(self.layout)
Pongámosle el nombre de EchoText y agreguemos lo que agregamos a nuestra ventana principal.
class EchoText(QtWidgets.QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.layout = QtWidgets.QGridLayout() self.setLayout(self.layout) self.textbox = QtWidgets.QLineEdit() self.echo_label = QtWidgets.QLabel('') self.textbox.textChanged.connect(self.textbox_text_changed) self.layout.addWidget(self.textbox, 0, 0) self.layout.addWidget(self.echo_label, 1, 0) def textbox_text_changed(self): self.echo_label.setText(self.textbox.text())
Uso como un widget normal
En nuestra ventana principal, deje solo el esqueleto y agregue lo siguiente:
self.echotext_widget = EchoText() self.layout.addWidget(self.echotext_widget)
y se muestra como cuando codificamos todo en la ventana principal.
La aplicación completa
Aquí está el código completo para toda la aplicación.
import sys from PyQt5 import QtWidgets from PyQt5 import QtCore from PyQt5 import QtGui class EchoText(QtWidgets.QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.layout = QtWidgets.QGridLayout() self.setLayout(self.layout) self.textbox = QtWidgets.QLineEdit() self.echo_label = QtWidgets.QLabel('') self.textbox.textChanged.connect(self.textbox_text_changed) self.layout.addWidget(self.textbox, 0, 0) self.layout.addWidget(self.echo_label, 1, 0) def textbox_text_changed(self): self.echo_label.setText(self.textbox.text()) class MainWindow(QtWidgets.QMainWindow): def __init__(self, parent = None): super().__init__(parent) self.init_gui() def init_gui(self): self.window = QtWidgets.QWidget() self.layout = QtWidgets.QGridLayout() self.setCentralWidget(self.window) self.window.setLayout(self.layout) self.echotext_widget = EchoText() self.layout.addWidget(self.echotext_widget) if __name__ == '__main__': app = QtWidgets.QApplication([]) win = MainWindow() win.show() sys.exit(app.exec_())
Intente crear un widget diferente y agréguelo. PyQt5 suena más difícil que Tkinter para comenzar, ¡pero vale la pena!
Publicación traducida automáticamente
Artículo escrito por abdurrahmaanjanhangeer y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA