Editor de texto desarrollado con PySide6 que incluye funcionalidades avanzadas como reconocimiento de voz, búsqueda y reemplazo, formateo de texto y un widget contador de palabras reutilizable.
Widget reutilizable que muestra estadísticas del texto en tiempo real: palabras, caracteres y tiempo estimado de lectura.
conteoActualizado = Signal(int, int)Señal emitida cada vez que se actualiza el conteo de palabras y caracteres en el WordCounterWidget.
En PySide6/Qt, las señales se definen con la clase Signal donde los parámetros entre paréntesis indican los tipos de datos que la señal transportará:
Signal(int, int) # Esta señal enviará DOS valores enteros
Signal(str) # Esta señal enviaría UN string
Signal() # Esta señal no envía datos (solo notifica)En nuestro caso Signal(int, int) significa:
- Primer
int: número de palabras - Segundo
int: número de caracteres
El método emit() es la forma de disparar/emitir una señal para notificar a todos los slots conectados:
# Definición de la señal (en la clase)
conteoActualizado = Signal(int, int)
# Emisión de la señal (en algún método)
self.conteoActualizado.emit(palabras, caracteres)
# ↑ ↑
# primer int segundo intFlujo completo:
- El texto cambia en el editor
- Se llama a
update_from_text(texto) - Se calculan palabras y caracteres
- Se ejecuta
self.conteoActualizado.emit(palabras, caracteres) - Todos los slots conectados reciben esos valores
# Conexión: cuando se emita la señal, ejecutar on_conteo_actualizado
self.contador_widget.conteoActualizado.connect(self.on_conteo_actualizado)
# Slot que recibe los valores emitidos
def on_conteo_actualizado(self, palabras, caracteres):
print(f"Recibido: {palabras} palabras, {caracteres} caracteres")| Parámetro | Tipo | Descripción |
|---|---|---|
palabras |
int |
Número total de palabras en el texto |
caracteres |
int |
Número total de caracteres en el texto |
Se emite automáticamente al llamar al método update_from_text(text).
from PySide6.QtWidgets import QApplication, QTextEdit, QVBoxLayout, QWidget
from contadorWidget import WordCounterWidget
class MiVentana(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout(self)
self.editor = QTextEdit()
self.contador = WordCounterWidget(wpm=200)
layout.addWidget(self.editor)
layout.addWidget(self.contador)
# Conectar el cambio de texto al contador
self.editor.textChanged.connect(self.actualizar)
# Conectar la señal conteoActualizado
self.contador.conteoActualizado.connect(self.on_conteo_actualizado)
def actualizar(self):
self.contador.update_from_text(self.editor.toPlainText())
def on_conteo_actualizado(self, palabras, caracteres):
print(f"📊 Palabras: {palabras} | Caracteres: {caracteres}")
if __name__ == "__main__":
app = QApplication([])
ventana = MiVentana()
ventana.show()
app.exec()WordCounterWidget(wpm=200, mostrarPalabras=True, mostrarCaracteres=True, mostrarTiempoLectura=True, parent=None)| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
wpm |
int |
200 |
Palabras por minuto para calcular tiempo lectura |
mostrarPalabras |
bool |
True |
Mostrar/ocultar el label de palabras |
mostrarCaracteres |
bool |
True |
Mostrar/ocultar el label de caracteres |
mostrarTiempoLectura |
bool |
True |
Mostrar/ocultar el label de tiempo de lectura |
parent |
QWidget |
None |
Widget padre |
Actualiza los contadores con el texto proporcionado y emite la señal conteoActualizado.
contador.update_from_text("Hola mundo, esto es un ejemplo.")
# Actualiza: Palabras: 6, Caracteres: 31
# Emite: conteoActualizado(6, 31)| Señal | Parámetros | Descripción |
|---|---|---|
recognized |
str |
Texto reconocido por el micrófono |
error |
str |
Mensaje de error si falla el reconocimiento |
status |
str |
Estado actual del proceso (calibrando, escuchando) |
finished |
— | Indica que el proceso de escucha ha terminado |
python PracticaFinal.pyPySide6SpeechRecognition(opcional, para reconocimiento de voz)PyAudio(opcional, para reconocimiento de voz)
pip install PySide6 SpeechRecognition PyAudioMiniDockQT6/
├── PracticaFinal.py # Aplicación principal
├── contadorWidget.py # Widget contador de palabras
├── README.md # Esta documentación
└── icons/ # Iconos de la aplicación