Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: El mas antiguo en 13 Agosto 2022, 15:33 pm



Título: Capturar un evento antes que ocurra, tkinter.-
Publicado por: El mas antiguo en 13 Agosto 2022, 15:33 pm
Hola gente, ¿cómo están?.
Créanme que como siempre antes de pedir ayuda busco práctico
y como en este caso cuando tengo que tirar la toalla recurro a Uds.
La consulta concreta es ¿hay alguna manera de capturar el evento
antes que se efectivice?, o ¿tiene esto otra solución?.-
En apariencia funciona, lo que ocurre es que cuando se ejecuta
la excepción el IDE se queda como en un bucle infinito y no se deja
cerrar.
Bueno, es todo, desde ya gracias, muchas gracias por el tiempo.

Código:
#-------------------------------------------------------------------------------
# Name:        módulo1
# Purpose:     Copiar/pegar
#
# Author:      Daniel
#
# Created:     11/08/2022
# Copyright:   (c) Daniel 2022
# Licence:     <your licence>
#-------------------------------------------------------------------------------
import tkinter as tk
from tkinter import ttk
from functools import partial
import funciones

def rehacer(text, temp, event):
    try:
        text.edit_undo()
    except:
        text.insert(tk.INSERT, temp)

    return


def main():

    root = tk.Tk()

    text = tk.Text(root,width = 55,height = 10, undo=True)
    text.pack()

    temp = """ La inteligencia no se mide por el número
 de palabras que sabes pronunciar,
 sino por aquellas que no dices para no lastimar!!!
 """

    text.insert(tk.INSERT, temp)

    root.bind('<Control-z>', partial(rehacer, text, temp))
   
    root.mainloop()


if __name__ == '__main__':
    main()

Slds. Daniel ☕☕☕


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: Danielㅤ en 13 Agosto 2022, 17:28 pm
Hola,  abajo de esta linea:

Código
  1.    except:

Inserta esta instrucción y prueba de nuevo:

Código
  1.    continue

Si no funciona prueba esta otra instrucción:

Código
  1.    pass


Nos comentas.


Saludos


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: El mas antiguo en 13 Agosto 2022, 17:53 pm
Hola tocayo, exactamente igual...

Código
  1. def rehacer(text, temp, event):
  2.    try:
  3.        text.edit_undo()
  4.    except:
  5.        pass
  6.  
  7.    return

https://ibb.co/gVFMn7r


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: Danielㅤ en 13 Agosto 2022, 18:15 pm
A ver prueba a cambiar el except por:

Código
  1.    finally:
  2.    pass


Saludos


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: El mas antiguo en 13 Agosto 2022, 20:39 pm
Ahora me ocurre lo mismo que antes de utilizar
el try-except.-


Citar
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Daniel Virgili\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\Daniel Virgili\Desktop\Practica\Copiar-pegar\Principal.py", line 18, in rehacer
    text.edit_undo()
  File "C:\Users\Daniel Virgili\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 3242, in edit_undo
    return self.edit("undo")
  File "C:\Users\Daniel Virgili\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 3198, in edit
    return self.tk.call(self._w, 'edit', *args)
_tkinter.TclError: nothing to undo


Slds. Daniel ☕☕☕


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: reymosquito en 14 Agosto 2022, 01:23 am
el tema es que con undo=True ya estás asociando a ctrl z y ctrl y con el Text y por lo tanto la función rehacer la línea root.bind('<Control-z>', partial(rehacer, text, temp)) están demás, sino ¿cuál es el sentido de undo=True?


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: El mas antiguo en 14 Agosto 2022, 02:30 am
No entiendo si me estás ayudando o criticando, es una obviedad lo que planteas,
lo que trato de hacer con esa función(aparentemente innecesaria) es buscar alguna
alternativa para que no me quede el widget vacío.-
Aprovecho para preguntar, ¿nadie sabe como acceder a la pila del widget text?,
si la tuviera tal vez al validar que estuviera vacía podría configurar undo=False.-

Slds. Daniel ☕☕☕


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: reymosquito en 14 Agosto 2022, 04:14 am
Citar
No entiendo si me estás ayudando o criticando
eso lo podés tomar como quieras, lo que te parece una obviedad, no lo es tanto si estás intentando cambiar la forma de interactuar de tkinter. y mucho menos es una obviedad lo que estás intentando hacer.


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: Danielㅤ en 14 Agosto 2022, 14:43 pm
Tiene razón el rey mosquito, nosotros tratamos de ayudarte, lo que vos queres no es común, porque lo común es cuando se quiere usar un evento que dispare al ejecutar tal instrucción o un control de una ventana gráfica, pero vos queres hacer un pre evento y la verdad no se mucho porque lo queres hacer así ni como exactamente, de todas maneras hay otras formas.


Saludos


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: El mas antiguo en 14 Agosto 2022, 15:12 pm
Lo que proponen Uds. es algo como esto, ¿no es así?, bien,
lo que me falta es saber como agregar un condicional para
que funcione correctamente y no me quede el widget vacío.-


Código
  1. import tkinter as tk
  2.  
  3. def undo(event):
  4.    print("Deshacer cancelado.")
  5.    return "break"
  6.  
  7.  
  8. def main():
  9.    root = tk.Tk()
  10.    text = tk.Text(root, width=55, height=10, undo=True)
  11.    text.pack()
  12.    temp = """ La inteligencia no se mide por el número
  13. de palabras que sabes pronunciar,
  14. sino por aquellas que no dices para no lastimar!!!
  15. """
  16.    text.insert(tk.INSERT, temp)
  17.    text.bind("<<Undo>>", undo)
  18.  
  19.    text.focus()
  20.    root.mainloop()
  21.  
  22.  
  23. if __name__ == '__main__':
  24.    main()
  25.  

ej:
agrego 123
           456
           789

Si pulso <Control-z> 1 vez queda:
            123
            456

Si pulso <Control-z> otra vez queda:
            123
                       
Pulso <Control-z> otra vez deja el TEXT vacío, esto es lo que
deseo evitar...

Slds. Daniel ☕☕☕


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: reymosquito en 14 Agosto 2022, 18:22 pm
no, de mi parte no propongo algo como eso, porque como ya dije ya definiste el uso de undo, hay muchas soluciones una puede ser:
#-*- coding: utf  -8 -*-
Código
  1. import tkinter as tk
  2.  
  3. def main():
  4.    root = tk.Tk()
  5.    text = tk.Text(root, width=55, height=10, undo=True)
  6.    text.pack()
  7.    temp = """ La inteligencia no se mide por el número
  8. de palabras que sabes pronunciar,
  9. sino por aquellas que no dices para no lastimar!!!
  10. """
  11.    text.insert(tk.INSERT, temp)
  12.    text.edit_reset()
  13.    text.focus()
  14.    root.mainloop()
  15.  
  16.  
  17. if __name__ == '__main__':
  18.    main()

donde evidentemente no vuelvo a vincular undo con nada.


Título: Re: Capturar un evento antes que ocurra, tkinter.-
Publicado por: El mas antiguo en 14 Agosto 2022, 21:26 pm
¿Qué puedo agregar?, gracias y que funciona perfectamente  ;-) ;-) ;-).-
Si agrego que no entiendo el porqué funciona con un solo edit_reset()
pero bueno algún día encontraré la explicación.-

Slds. Daniel ☕☕☕