Primeros pasos con pyqt5
Ejemplo de Hola Mundo
Este ejemplo crea una ventana simple con un botón y una edición de línea en un diseño. También muestra cómo conectar una señal a una ranura, de modo que al hacer clic en el botón se agregue algo de texto a la línea de edición.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Hello World')
w.show()
sys.exit(app.exec_())
Análisis
aplicación = QtWidgets.QApplication(sys.argv)
Cada aplicación PyQt5 debe crear un objeto de aplicación. El parámetro sys.argv es una lista de argumentos de una línea de comando. Los scripts de Python se pueden ejecutar desde el shell.
w = QWidget()
El widget QWidget
es la clase base de todos los objetos de interfaz de usuario en PyQt5. Proporcionamos el constructor predeterminado para QWidget
. El constructor predeterminado no tiene padre. Un widget sin padre se llama ventana.
w.resize(250, 150)
El método resize()
cambia el tamaño del widget. Tiene 250px de ancho y 150px de alto.
w.move(300, 300)
El método move()
mueve el widget a una posición en la pantalla en las coordenadas x=300, y=300.
w.setWindowTitle('Hello World')
Aquí establecemos el título de nuestra ventana. El título se muestra en la barra de título.
w.show()
El método show()
muestra el widget en la pantalla. Primero se crea un widget en la memoria y luego se muestra en la pantalla.
sys.exit(app.exec_())
Finalmente, ingresamos al mainloop de la aplicación. El manejo de eventos comienza desde este punto. El bucle principal recibe eventos del sistema de ventanas y los envía a los widgets de la aplicación. El bucle principal finaliza si llamamos al método exit()
o se destruye el widget principal. El método sys.exit()
asegura una salida limpia. Se informará al medio ambiente cómo finalizó la aplicación.
El método exec_()
tiene un guión bajo. Es porque exec es una palabra clave de Python. Y por lo tanto, se usó exec_()
en su lugar.
Añadir un icono de aplicación
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Análisis
Argumentos de función en Python
En Python, las funciones definidas por el usuario pueden tomar cuatro tipos diferentes de argumentos.
- Argumentos predeterminados:
- Definición de función
def defaultArg(nombre, mensaje = "¡Hola!"):
-
Llamada de función
defaultArg( name)
- Argumentos requeridos:
-
Definición de función
def requiredArg (str,num):
-
Llamada de función:
requiredArg ("Hello",12)
- Argumentos de palabras clave:
-
Definición de función
def keywordArg( name, role ):
-
Llamada de función
keywordArg( name = "Tom", role = "Manager")
or
keywordArg( role = "Manager", name = "Tom")
- Número variable de argumentos:
-
Definición de función
def varlengthArgs(*varargs):
-
Llamada de función
varlengthArgs(30,40,50,60)
class Example(QWidget):
def __init__(self): super().__init__() ...
Tres cosas importantes en la programación orientada a objetos son las clases, los datos y los métodos. Aquí creamos una nueva clase llamada Ejemplo
. La clase Example
hereda de la clase QWidget
. Esto significa que llamamos a dos constructores: el primero para la clase Ejemplo
y el segundo para la clase heredada. El método super()
devuelve el objeto principal de la clase Example
y llamamos a su constructor. La variable self
se refiere al objeto mismo.
¿Por qué hemos usado __init__
?
Mira esto:
class A(object):
def __init__(self):
self.lst = []
class B(object):
lst = []
y ahora intenta:
>>> x = B()
>>> y = B()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1, 2]
>>> x.lst is y.lst
True
y esto:
>>> x = A()
>>> y = A()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1]
>>> x.lst is y.lst
False
¿Significa esto que x en la clase B se establece antes de la creación de instancias?
Sí, es un atributo de clase (se comparte entre instancias). Mientras que en la clase A es un atributo de instancia.
self.initUI()
La creación de la GUI se delega al método initUI()
.
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
Los tres métodos han sido heredados de la clase QWidget
. setGeometry()
hace dos cosas: ubica la ventana en la pantalla y establece su tamaño. Los dos primeros parámetros son las posiciones x e y de la ventana. El tercero es el ancho y el cuarto es la altura de la ventana. De hecho, combina los métodos resize()
y move()
en un solo método. El último método establece el icono de la aplicación. Para ello, hemos creado un objeto QIcon
. El QIcon
recibe la ruta a nuestro icono para ser mostrado.
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Se crean la aplicación y los objetos de ejemplo. Se inicia el bucle principal.
Mostrando una información sobre herramientas
import sys
from PyQt5.QtWidgets import (QWidget, QToolTip,
QPushButton, QApplication)
from PyQt5.QtGui import QFont
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif', 10))
self.setToolTip('This is a <b>QWidget</b> widget')
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
btn.resize(btn.sizeHint())
btn.move(50, 50)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Tooltips')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Análisis
QToolTip.setFont(QFont('SansSerif', 10))
Este método estático establece una fuente utilizada para representar información sobre herramientas. Usamos una fuente SansSerif de 10px.
self.setToolTip('This is a <b>QWidget</b> widget')
Para crear una información sobre herramientas, llamamos al método setTooltip()
. Podemos usar el formato de texto enriquecido.
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
Creamos un widget de botón pulsador y configuramos una información sobre herramientas para él.
btn.resize(btn.sizeHint())
btn.move(50, 50)
El botón está siendo redimensionado y movido en la ventana. El método sizeHint()
proporciona un tamaño recomendado para el botón.
Empaqueta tu proyecto en ejecutable/instalador
cx_Freeze: una herramienta puede empaquetar su proyecto en ejecutable/instalador
- después de instalarlo por pip, para empaquetar
demo.py
, necesitamossetup.py
a continuación.
import sys
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
"excludes": ["tkinter"],
"include_files":[('./platforms','./platforms')] # need qwindows.dll for qt5 application
}
# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup( name = "demo",
version = "0.1",
description = "demo",
options = {"build_exe": build_exe_options},
executables = [Executable("demo.py", base=base)])
- entonces construye
python .\setup.py build
- entonces dist
python .\setup.py bdist_msi
Instalación o Configuración
- Instale Anaconda (PyQt5 está integrado), especialmente para usuarios de Windows.
- Integre QtDesigner y QtUIConvert en PyCharm (herramientas externas)
- Escribir demostración
- new window.ui by external tool(QtDesigner)
- convert to window.py by external tool(PyUIConv)
- demo
import sys from PyQt5.QtWidgets import QApplication,QMainWindow from window import Ui_MainWindow if __name__ == '__main__': app = QApplication(sys.argv) w = QMainWindow() ui = Ui_MainWindow() ui.setupUi(w) w.show() sys.exit(app.exec_())
- new window.ui by external tool(QtDesigner)