Foros Python

Versión completa: Doble-clic para obtener fila/columna inicio/final
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola Francisco, hola gente, buen día.-
Te cuento lo que me pasa, quiero hacer lo mismo(que hace este programa)
pero en un solo paso, o sea al hacer un doble-clic, obtener la fila/columna
inicio/final, desconozco como se lanza el evento, pero me imagino que al hacer
doble-clic va primero al método y encuentra que no hay nada seleccionado.-
¿se podrá?.- 


Código:
#-------------------------------------------------------------------------------
# Name:        módulo1
# Purpose:     Marcar ubicación fila/columna(inicio y final)
#
# Author:      Daniel
#
# Created:     11/05/2022
# Copyright:   (c) Daniel 2022
# Licence:     <your licence>
#-------------------------------------------------------------------------------
import tkinter as tk
from tkinter import ttk, messagebox
from functools import partial

def obtenerSeleccion(texto, event):
    # Obtener los índices del inicio y fin de la selección
    try:
        first = texto.index(tk.SEL_FIRST)
    except:
        messagebox.showinfo(" Información", " No tiene ninguna palabra seleccionada...")
    else:
        last  = texto.index(tk.SEL_LAST)
        seleccion = texto.get(first, last)
        print(f" Palabra seleccionada <{seleccion}> inicio --> {first} final --> {last}")


def main():
    v_principal = tk.Tk()
    v_principal.title(" Doble clic y seleccionar palabra")
    v_principal.geometry("600x400+500+300")

    texto = tk.Text(v_principal, font=("vardana", 12))
    texto.place(x=5, y=5, width=580, height=300)

    texto.insert(1.0, "Yo soy de Arequito y soy una buena persona")

    texto.bind('<Button-3>', partial(obtenerSeleccion, texto))


    v_principal.mainloop()

if __name__ == '__main__':
    main()
Slds. Daniel ☕☕☕
Hola, Daniel.

Habría que usar el evento <Double-Button-1>, algo así:

Código:
import tkinter as tk
from tkinter import ttk, messagebox
from functools import partial


def obtener_seleccion():
    # Obtener los índices del inicio y fin de la selección
    try:
        first = texto.index(tk.SEL_FIRST)
    except:
        messagebox.showinfo(" Información", " No tiene ninguna palabra seleccionada...")
    else:
        last  = texto.index(tk.SEL_LAST)
        seleccion = texto.get(first, last)
        print(f" Palabra seleccionada <{seleccion}> inicio --> {first} final --> {last}")


def texto_doble_clic(texto, event):
    # Ejecutar obtener_seleccion() luego de que Tk procese
    # el evento doble clic.
    v_principal.after(1, obtener_seleccion)


v_principal = tk.Tk()
v_principal.title(" Doble clic y seleccionar palabra")
v_principal.geometry("600x400+500+300")
texto = tk.Text(v_principal, font=("vardana", 12))
texto.place(x=5, y=5, width=580, height=300)
texto.insert(1.0, "Yo soy de Arequito y soy una buena persona")
texto.bind('<Double-Button-1>', partial(texto_doble_clic, texto))
v_principal.mainloop()

El problema es que si respondemos al evento <Double-Button-1>, nuestra función se va a ejecutar antes de que la palabra se llegue a seleccionar. Para que se ejecute después, hacemos un pequeño truquito con la función after() de Tk, posponiendo la ejecución de obtener_seleccion() para que corra después de que Tk haya tenido tiempo de seleccionar la palabra. Te dejo un artículo sobre after(): https://recursospython.com/guias-y-manua...n-tkinter/.

Saludos
Hola Francisco, gracias, funciona como lo esperado, creo que
si no fuese por este hilo no me hubiera enterado de la existencia
de la función after(), en casi todos los tutoriales se utiliza time.-
Bueno, la duda que tengo en este momento creo que se las trae,
por el momento no los voy a consultar porque quiero seguir buscando
y buscando, si para dentro de una semana no la encuentro seguramente
me verán dar de alta otro hilo.-

Slds. Daniel ☕☕☕