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():

Escribir una imagen (iso) en una memoria SD en Linux

Si tienes que grabar una imagen (por ejemplo de la Raspberri Pi) en una tarjeta SD o en USB no basta con copiarla directamente en la tarjeta, debemos usar un programa para volcado de imágenes iso.

Uno que uso yo muy sencillito es USB-Imagewriter.

Si no lo tenemos instalado basta con abrir una consola y teclear:

sudo apt-get install usb-imagewriter

Una vez instalado abrimos el programa con el siguiente comando:

sudo imagewriter

También podemos abrirlo a través del menú (suele estar en Aplicaciones->Imagewriter) .

Imagewriter

Imagewriter

1) Seleccionamos la imagen con el desplegable junto a “Escribir imagen”.

2) Seleccionamos el dispositivo USB o SD en el que la vamos a escribir pinchando en el desplegable junto a “a”.

3) Click en “Escribir al dispositivo”.

4) Esperar a que termine y listo.

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.

Python: sacar las iniciales de un nombre

A veces me maravillo con lo que se puede hacer en Python con un poco de imaginación. Os dejo aquí un sencillo ejemplo que permite extraer la iniciales de un nombre. Por ejemplo:

Luisa Puerros Cebollas -> LPC
Paco Larvas -> PL

Y aquí el código:

import re
 
m = re.findall('([A-Z])[A-Za-z]* *', "Luisa Puerros Cebollas")
iniciales = "".join(m)
print(m, iniciales)

La expresión regular de findall nos buscará las palabras separadas por un espacio y devolverá una lista con las iniciales. Con join juntamos los elementos de la lista en una única cadena.

Ejercicios de examen de C

Otro de los proyectos que tengo en marcha (suma y sigue) es un libro con ejercicios de examen de C resueltos y comentados. Para hacerlo más completo necesito más ejercicios. Si quieres colaborar puedes enviarme alguno.

¿Qué ganas enviando un ejercicio de examen?

  • Si tu ejercicio se incluye en el libro tendrás una copia gratuita del libro.

Condiciones:

  • No se trata de un servicio para solucionar problemas de examen.
  • No se admiten trabajos de clase, proyectos, ni similares, sólo ejercicios de examen.

Para colaborar rellena este formulario:

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_())

Kiki un sencillo programa para probar expresiones regulares

Kiki es un programa (con un curioso nombre) que nos permite probar de manera rápida y sencilla expresiones regulares. Puede ser de mucha ayuda cuando estás diseñando tu propia expresión regular.

Por ejemplo, si estás buscando una expresión regular para comprobar si un email es válido puede venirte muy bien.

En este caso vamos a probar la expresión:

[A-Za-z0-9_\.]+@[A-Za-z0-9_\.]+\.[A-Za-z]+

y vamos a usar estos emails para el test:

nombre.apellido@correo.com
nombre_2013@correofalso.es
minombre1234@fakeemail.net
nombre@mail.correo.es

Una vez introducidos los datos hacemos click en el botón Evaluate y tendremos el resultado de la operación.

Os dejo un para de capturas de pantalla para que veáis cómo funciona:

kiki - probar expresiones regulares

kiki – probar expresiones regulares

kiki - probar expresiones regulares

kiki – resultado de la prueba

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_())

Enciclopedia de proyectores

En AbacoProyectores.com estamos preparando una enciclopedia de proyectores donde insertaremos información sobre el mayor número de equipos. La enciclopedia está basada en un desarrollo interno que utilizamos para consultar las características de los equipos que alquilamos.

Estad atentos porque en breve lo pondremos en marcha.

AbacoProyectores alquiler de proyectores y ordenadores portátiles

AbacoProyectores alquiler de proyectores y ordenadores portátiles