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.

  1. Argumentos predeterminados:
  • Definición de función

def defaultArg(nombre, mensaje = "¡Hola!"):

  • Llamada de función

    defaultArg( name)

  1. Argumentos requeridos:
  • Definición de función

    def requiredArg (str,num):

  • Llamada de función:

    requiredArg ("Hello",12)

  1. 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")

  1. 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, necesitamos setup.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

  1. Instale Anaconda (PyQt5 está integrado), especialmente para usuarios de Windows.
  2. Integre QtDesigner y QtUIConvert en PyCharm (herramientas externas)
    • Open PyCharm Settings > Tools > External Tools
    • Create Tool(QtDesigner) - used to edit *.ui files
    • Create Tool(PyUIConv) - used to convert *.ui to *.py
  3. 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_())