PyQT: Abrir una ventana emergente

Os dejo aquí otro ejemplo de cómo abrir una ventana emergente en PyQT. La ventana emergente es del tipo QDialog:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
 
class Principal(QWidget): 
    def __init__(self, *args): 
        QWidget.__init__(self, *args)
 
        contenedor = QVBoxLayout()
        self.setLayout(contenedor)
 
        btnAbrir = QPushButton("Abrir ventana",None)
        contenedor.addWidget(btnAbrir)
        self.connect(btnAbrir, SIGNAL("clicked()"), self.abrir)
 
        btnSalir = QPushButton("Salir",None)
        contenedor.addWidget(btnSalir)
        self.connect(btnSalir, SIGNAL("clicked()"), self.salir)
 
    def abrir(self):
        ventana = Secundaria().exec_()
 
    def salir(self):
        exit()
 
class Secundaria(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
 
        contenedor = QVBoxLayout()
        self.setLayout(contenedor)
 
        btnSalir = QPushButton("Salir",None)
        contenedor.addWidget(btnSalir)
        self.connect(btnSalir, SIGNAL("clicked()"), self.salir)
 
    def salir(self):
        exit()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    principal = Principal()
    principal.show()
    sys.exit(app.exec_())

PyQT (y IV): Ejemplo de QCheckbox

Como ya es costumbre este miércoles toca un nuevo mini artículo sobre PyQT. Hoy vamos a ver un ejemplo de QCheckbox:

Ejemplo PyQT Checkbox

Ejemplo PyQT Checkbox

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
 
class Controles(QWidget): 
    def __init__(self, *args): 
        QWidget.__init__(self, *args)
 
        contenedor = QVBoxLayout()
        self.setLayout(contenedor)
 
        self.label = QLabel("Checkbox desactivado")
        contenedor.addWidget(self.label)
 
        self.checkbox = QCheckBox("Click para cambiar texto")
        contenedor.addWidget(self.checkbox)
        self.connect(self.checkbox, SIGNAL("stateChanged(int)"), self.cambiar)
 
        btnSalir = QPushButton("Salir",None)
        contenedor.addWidget(btnSalir)
        self.connect(btnSalir, SIGNAL("clicked()"), self.salir)
 
    def cambiar(self):
        if self.checkbox.isChecked():
            self.label.setText('Checkbox activado')
        else:
            self.label.setText('Checkbox desactivado')
 
    def salir(self):
        exit()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    controles = Controles()
    controles.show()
    sys.exit(app.exec_())

Como detalle a destacar en este ejemplo hemos asociado el método self.cambiar a la señal stateChanged (que es la que se produce cuando se marca o desmarca la casilla):

self.connect(self.checkbox, SIGNAL("stateChanged(int)"), self.cambiar)

Es muy importante no olvidar el (int).

Otro punto importante es el método isChecked() que nos permite saber en todo momento si el checkbox está marcado o no:

if self.checkbox.isChecked():

Error en Python+PyQT: expected string, QString found

Esto ya me lo han consultado un par de personas así que escribo este post para poner la solución. Es posible que te encuentres con un error parecido a éstos:

TypeError: sequence item 0: expected string, QString found
TypeError: popen() argument 1 must be string, not QString

El problema se debe a que la una función espera un parámetro tipo string pero le damos uno de tipo QString. QString es el tipo de string que se usa en PyQT (por ejemplo en un QLineEdit). La solución pasa por usar la función str(). Por ejemplo:

nombre = str(self.NombreLineEdit.text())

Y nombre ya es de tipo string en lugar de QString.

PyQT (y III): Ejemplo de getOpenFileName y getSaveFileName

En esta nueva entrega os dejo un ejemplo del manejo de diálogos para selección de ficheros. Este ejemplo no hace nada con los ficheros seleccionados (no los abre realmente ni los guarda). Sin embargo tiene unas características interesantes:

  • El ejemplo recuerda el último fichero que se ha abierto y al guardar propone sobreescribir el fichero.
  • Al abrir o guardar el nombre del fichero aparece en el título de la ventana.
  • Cuando abrimos o guardarmos recuerda la última carpeta en la que hemos abierto o guardado.
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
 
class Controles(QWidget):
 
    ruta = ""
    fichero_actual = ""
 
    def __init__(self, *args): 
        QWidget.__init__(self, *args)
 
        self.setWindowTitle("Programa Ejemplo")
 
        contenedor = QVBoxLayout()
        self.setLayout(contenedor)
 
        btnAbrir = QPushButton("Abrir",None)
        contenedor.addWidget(btnAbrir)
        self.connect(btnAbrir, SIGNAL("clicked()"), self.abrir)
 
        btnGuardar = QPushButton("Guardar",None)
        contenedor.addWidget(btnGuardar)
        self.connect(btnGuardar, SIGNAL("clicked()"), self.guardar)
 
        btnNuevo = QPushButton("Nuevo",None)
        contenedor.addWidget(btnNuevo)
        self.connect(btnNuevo, SIGNAL("clicked()"), self.nuevo)
 
        btnSalir = QPushButton("Salir",None)
        contenedor.addWidget(btnSalir)
        self.connect(btnSalir, SIGNAL("clicked()"), self.salir)
 
    def abrir(self):
        nombre_fichero = QFileDialog.getOpenFileName(self, "Abrir fichero", self.ruta)
        if nombre_fichero:
            self.fichero_actual = nombre_fichero
            self.setWindowTitle(QFileInfo(nombre_fichero).fileName())
            self.ruta = QFileInfo(nombre_fichero).path()
 
            # TODO - Aqui va el codigo
 
    def guardar(self):
        if self.fichero_actual:
            ruta_guardar = self.fichero_actual
        else:
            ruta_guardar = self.ruta
 
        nombre_fichero = QFileDialog.getSaveFileName(self, "Guardar fichero", ruta_guardar)
        if nombre_fichero:
            self.fichero_actual = nombre_fichero
            self.setWindowTitle(QFileInfo(nombre_fichero).fileName())
            self.ruta = QFileInfo(nombre_fichero).path()
 
            # TODO - Aqui va el codigo
 
    def nuevo(self):
        self.fichero_actual = ""
        self.ruta = ""
        self.setWindowTitle("Programa Ejemplo")
 
    def salir(self):
        exit()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    controles = Controles()
    controles.show()
    sys.exit(app.exec_())

PyQT (y II): Ejemplo de qLabel, qLineEdit y qButton

En esta segunda entrega de PyQT vamos a ver un ejemplo que usa una etiqueta (qLabel), un control para edición de texto (qLineEdit) y un botón (qButton).

En este ejemplo tenemos un qLineEdit cuyo contenido podemos borrar al hacer click en el botón borrar:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
 
class Controles(QWidget): 
    def __init__(self, *args): 
        QWidget.__init__(self, *args)
 
        contenedor = QVBoxLayout()
        self.setLayout(contenedor)
 
        label = QLabel("Texto: ")
        contenedor.addWidget(label)
 
        self.qle_texto = QLineEdit()
        contenedor.addWidget(self.qle_texto)
 
        btnBorrar = QPushButton("Borrar",None)
        contenedor.addWidget(btnBorrar)
        self.connect(btnBorrar, SIGNAL("clicked()"), self.borrar)
 
        btnSalir = QPushButton("Salir",None)
        contenedor.addWidget(btnSalir)
        self.connect(btnSalir, SIGNAL("clicked()"), self.salir)
 
    def borrar(self):
        self.qle_texto.setText("")
 
    def salir(self):
        exit()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    controles = Controles()
    controles.show()
    sys.exit(app.exec_())

PyQT: Ejemplo de botón

Con este artículo voy a empezar una pequeña serie sobre programación en PyQT (Python+QT).

Voy a comenzar con un sencillo programa que tiene únicamente un botón para salir:

Ejemplo de QButton

Resultado del programa.

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
 
class Ventana(QWidget): 
    def __init__(self, *args): 
        QWidget.__init__(self, *args)
 
        contenedor = QVBoxLayout()
        self.setLayout(contenedor)
 
        btnSalir = QPushButton("Salir", None)
        contenedor.addWidget(btnSalir)
        self.connect(btnSalir, SIGNAL("clicked()"), self.salir)
 
    def salir(self):
        exit()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    ventana = Ventana()
    ventana.show()
    sys.exit(app.exec_())

Vamos a ver la clase Controles paso a paso.

Primero creamos un Layout donde va a ir el botón:

contenedor = QVBoxLayout()

y lo ponemos como el layout principal:

self.setLayout(contenedor)

Creamos el botón con el texto “Salir”:

btnSalir = QPushButton("Salir",None)

Lo añadimos al layout principal:

contenedor.addWidget(btnSalir)

Y por último asociamos el evento que se produce al hacer click en el botón con el método (o función) salir:

self.connect(btnSalir, SIGNAL("clicked()"), self.salir)

La función salir simplemente se encarga de cerrar el programa:

def salir(self):
    exit()