Seguimos viendo ejemplos de como crear interfaces con ttkDesigner. Hemos visto botones y labels, listas o sliders. Los siguiente widgets que vamos a ver es el widget FilePicker y Text Edit.
¿Que es un File Picker?
Es una herramienta visual que nos permite seleccionar un archivo específico desde tu sistema de archivos. Es como una ventana emergente que te muestra la estructura de tus carpetas y archivos, y te permite navegar entre directorios hasta encontrar la carpeta o archivo que deseas. Con el se pueden abrir archivos, guardar los datos o la selección múltiple de archivo.
¿Que es un Text Edit?
El widwet Text Edit nos permite crear áreas de texto multilinea es una especie de caja donde el usuario puede escribir o pegar texto de varias líneas, como si fuera un pequeño editor de texto dentro de la aplicación. Con Text Edit podemos mostrar información, capturar texto y editarlo. Sus características principales pueden ser la capacidad de ser multilínea, incluir una barra de scroll y con un poquito de programación se pueden aplicar diferentes formatos al texto como negrita, cursiva, subrayado, etc.
Como ya hemos hablado anteriormente sobre como crear una interfaz, vamos crear una con los siguientes elementos:
- Un widget tipo File Picker al que llamaremos "Tfpicker_open"
- Un widget tipo File Picker al que llamaremos "Tfpicker_save"
- Un widget tipo Label al que llamaremos "lb1"
- Un widget tipo TextEdit al que llamaremos "textedit"
ttkDesigner |
Para este ejemplo necesitamos crear un archivo llamado "texto.txt", puede contener el texto que queramos o incluso estar vacío.
Este archivo lo situaremos en la misma carpeta del proyecto. No es obligatorio que el archivo este en esa ubicación pero para este ejemplo sera suficiente.
En el programa nos vamos a encontrar con la definición de los widgets y su conexión con las funciones:
# Conectamos el Filepicker con el evento "abrirArchivo"
self.getWidgetByName("Tfpicker_open").filePicked.connect(self.abrirArchivo)
# Texto que se mostrará en el widget Filepicker "Tfpicker_save"
self.getWidgetByName("Tfpicker_save").setText("Save file as...")
# Conectamos el Filepicker con el evento "guardarArchivo"
self.getWidgetByName("Tfpicker_save").filePicked.connect(self.guardarArchivo)
# TTkLabel
self.lb01 = self.getWidgetByName("lb1")
self.lb01.setText("No hay datos")
# TTkLabel
self.text_edit = self.getWidgetByName("textedit")
self.text_edit.setText("No hay datos")
Y este sera el resulatado, Se puede modificar el texto que muestra File Picker con ".setText" y poner el mensaje que queramos.
TermTk con File Picker y Text Edit |
Ahora conectamos esos objetos a sus funciones slots. El primero llamara a la función "abrirArchivo".
# Rutina generica para abrir/leer un archivo
pyTTkSlot(str)
def abrirArchivo(self, fileName):
with open(fileName) as fp:
# Pone el la ruta y el nombre en el widget "lb1"
self.lb01.setText(f"Open: {fileName}")
# Pone el contenido del archivo en el "textedit"
self.text_edit.setText(fp.read())
Ventana emergente File Picker |
Una vez que seleccionemos el archivo "texto.txt" (o vuestro archivo preferido). El texto se mostrará en el Text Edit como se muestra a continuación:
Archivo "texto.txt" mostrado en Text Edit |
La otra función que llamara el programa se llama "guardarArchivo".
# Rutina generica para guardar el contenido del widget "textedit"
pyTTkSlot(str)
def guardarArchivo(self, fileName):
# Guarda el contenido del widget "textedit" a un
# archivo con el nombre asignado
with open(fileName, 'w') as fp:
self.lb01.setText(f"saved: {fileName}")
fp.write(self.text_edit.toPlainText())
Este es el ejemplo completo. Con el podemos abrir un archivo de texto, editarlo y guardarlo. Además La ruta del archivo que abramos se muestra en el Label situado en la parte superior de la ventana.
from TermTk import TTkUtil, TTkUiLoader, TTk, TTkContainer, pyTTkSlot
class ClassFilePicker(TTkContainer):
def __init__(self):
# Data generated using ttkDesigner
TTkUiLoader.loadDict(TTkUtil.base64_deflate_2_obj(
"eJyFlMtP20AQhx3ycEJAtIUGFaTKx9BDBD1UqmirQsqjmISoROVQVdXGXjIrHG9kr3lUQuoxkea4/X87axtEQbSxLO/M7OP7zczmV+l3pWylv2vdRPucR7GQocby69Z6" +
"a11jUSVCm1DZC1gca5zr98/aMlRMhDzSWBmziI3idEqpy0Zc42yHYici9OWFxmpPxkKZLb/rpltyZziWjsVPnpoDd5VjrSNC50T4CrRr0WKy9rkYgjJmrcMu8+CBZRVM" +
"nBx5PPPYX0UsBgHXE7R3QkYj3wz7UgZ9MdZoabR7zPdFOEwPtbKHY+WQXclEaayRpHycYCXIRiQIyrAC9jWJ2ONyxFV0lS8nbqVjrHogAj/iRls6Pd0pV24WNqGGpf6F" +
"CDXUM/kFDvNmtOkuc1hwLXhC79NUCDzLPosTWJrAc2jAsplZdAvm4fACVrCyLSOf0j7Bcl8o0gwNnMsOdHYDNoxNTqxqAqt38OFlRv3WXSRqcGjXjLaa6h7w4Ba2GAw2" +
"ctYCpShjbZjTF1ybWAuPsZJMfkmptLvSORUEhuW2DCQ1SGn12/qIcrwViGE44qEpa4LFiFJE9S16MjBfm+x4zELtFtAmXz5OMtBFAt2lXbcTpWTYE94Z5eCGeb5/Ok49" +
"P+SYh7f0N5lecouGvk70xUcz/QZrR7Q4Q4e1CdbawL0z00x6inZqUFtNsdRj1IpYaJHUNhunjY11w+Z8EiyQQ/KTpegaaZzfCgLHxGKn+WqN5m15Hh8rpyN9njZ3ui63" +
"EtikVnhH73tK84cb7fDxoc6YnfNcZ+O+zpl/66R3bQK7U9ibwj58hoO/4eHwPjR0iejoUTysU2lM6Xd8oW5LUlXk4aknr0Y5p9xw5//b91g/pP8Wp5uMBlTmKS7dMZ1j" +
"xSJlrrLJ3xfOfOcoDK5o1mwnCZRwzFw9eUjLH7pYkmDdk2HIPVPHmG5x0voDJL2grQ=="), self)
# Conectamos el Filepicker con el evento "abrirArchivo"
self.getWidgetByName("Tfpicker_open").filePicked.connect(self.abrirArchivo)
# Texto que se mostrará en el widget Filepicker "Tfpicker_save"
self.getWidgetByName("Tfpicker_save").setText("Save file as...")
# Conectamos el Filepicker con el evento "guardarArchivo"
self.getWidgetByName("Tfpicker_save").filePicked.connect(self.guardarArchivo)
# TTkLabel
self.lb01 = self.getWidgetByName("lb1")
self.lb01.setText("No hay datos")
# TTkLabel
self.text_edit = self.getWidgetByName("textedit")
self.text_edit.setText("No hay datos")
# Rutina generica para abrir/leer un archivo
pyTTkSlot(str)
def abrirArchivo(self, fileName):
with open(fileName) as fp:
# Pone el la ruta y el nombre en el widget "lb1"
self.lb01.setText(f"Open: {fileName}")
# Pone el contenido del archivo en el "textedit"
self.text_edit.setText(fp.read())
# Rutina generica para guardar el contenido del widget "textedit"
pyTTkSlot(str)
def guardarArchivo(self, fileName):
# Guarda el contenido del widget "textedit" a un
# archivo con el nombre asignado
with open(fileName, 'w') as fp:
self.lb01.setText(f"saved: {fileName}")
fp.write(self.text_edit.toPlainText())
if __name__ == '__main__':
root=TTk()
root.layout().addWidget(ClassFilePicker())
root.mainloop()
Este es otro ejemplo de como TermTk ofrece una forma intuitiva y eficiente de crear interfaces para terminal. El manejo de archivos es algo básico en una interfaz donde queramos cargar alguna configuración, guardar los datos que hayamos creado o modificado facilitando así la interacción del usuario con el sistema de archivos.
Aquí tienes algunos ejemplos sobre TermTk y ttkDesigner:
Programa de ejemplo de este articulo en GitHub
pyTermTk y ttkDesigner: Button y Lablel
pyTermTk y ttkDesigner: List, ListSelect y Lablel
pyTermTk y ttkDesigner: Slider y Label
Librería PyTermTk crea interfaces en terminal
Sígueme para más artículos sobre TermTk y otros temas de programación, Saludos!!!