Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Obtener relación entre píxeles y fila/columnas en widget TEXT.
#1
Hola gente, ¿ cómo están?, hola Francisco.-
Necesitaría saber si se puede obtener alguna relación entre píxeles y fila/columnas.-
Para ejemplificar, tengo un widget TEXT y necesito relacionar el contenido en fila/columnas
para establecer las dimensiones de este y la ventana.-

Código:
from tkinter import ttk
import tkinter as tk
import tkinter.scrolledtext as scrolledtext
import codecs

def centrar_ventana(root):
    w = 500
    h = 500

    ws = root.winfo_screenwidth()
    hs = root.winfo_screenheight()
    x = (ws/2) - (w/2)
    y = (hs/2) - (h/2)
    root.geometry('%dx%d+%d+%d' % (w, h, x, y))


#Función para pasar de los métodos al correspondiente código.
def boton_codigo(lista_ayuda_secundaria, segunda_Ayuda, lista_codigo, ventana):
    if len(segunda_Ayuda.curselection())!=0:
        listaCodigo = []
        codigoLista = "".join(lista_codigo)
        cont=0
        with codecs.open('codigos.txt', 'r', encoding='utf-8') as archivo:
            for linea in archivo:
                lineaTmp = linea.rstrip('\n,\r')
                tmpLinea = lineaTmp.split(',')
                codigoCodigos = lineaTmp[:4]
                if codigoLista == codigoCodigos:
                    cont += 1
                    listaCodigo.append(tmpLinea[1])
                elif codigoLista != codigoCodigos and cont == 1:
                    break
    else:
        messagebox.showinfo(message="Debe seleccionar un item.", title="!!! Atención !!!")
       
   
    t1 = tk.Toplevel(ventana)
    t1.title("Códigos")
    t1.focus_set()
    centrar_ventana(t1)
    t1.grab_set()
    t1.transient(master=ventana)

    muestra_codigo = scrolledtext.ScrolledText(t1, width=58, height = cont+1)
    muestra_codigo.place(x=10, y=10)

    for lista in listaCodigo:
        muestra_codigo.insert(tk.INSERT, lista)

    muestra_codigo.config(state= tk.DISABLED)
    t1.wait_window(t1)


Bueno, es todo, espero encontrar aquí la respuesta porque llevo horas buscando y nada.-

Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#2
Hola, Daniel.

¿Querés saber cuánto mide una columna y una fila del tk.Text en píxeles? Desconozco si hay un método en Tk para averiguarlo, pero supongo que se puede calcular sabiendo el tamaño de la fuente del texto.

Saludos
Responder
#3
Hola Francisco, buen día, dejo lo que pude lograr, si bien es bastante rebuscado
parece ser que la medida en píxeles no funciona con un string, solamente
sirve para los widget, tal vez ahora entiendas cuál era mi duda.

Código:
import tkinter as tk
from tkinter import ttk

def pixeles():
    measure = tk.Label(ventana, font = ("Vardana", 12), text = var.get())
    measure.place(x=5, y=8)
    measure.update_idletasks()
    width = measure.winfo_width()
    pixeles = f'"{var.get()}" tiene una ancho de {width} pixeles'   
    measure.config(text = pixeles)
    measure.update_idletasks()
    w = measure.winfo_width() + 10
    h = 150
    x = 700
    y = 500
    ventana.geometry('%dx%d+%d+%d' % (w, h, x, y))



ventana = tk.Tk()
ventana.geometry("300x150+700+500")

var = tk.StringVar()
medir = ttk.Entry(ventana, font = ("Vardana", 12), width=30,
              textvariable=var)
medir.place(x=10, y=40)

boton = ttk.Button(ventana, text="Medir",
       command=pixeles)
boton.place(x=110, y=80, width=80, height=40)

medir.focus()

ventana.mainloop()


Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#4
Hola, Daniel.

Entiendo que querés averiguar el ancho en píxeles de un texto determinado. Tu solución me parece bien, pero ojo con crear una etiqueta dentro de un botón: se crea una etiqueta nueva cada vez que el usuario presiona el botón. Si lo presiona muchas veces, en algún momento te quedás sin recursos. Mejor sería crear un tk.Label afuera del botón y después simplemente cambiarle el texto dentro del botón.

Por otro lado, usando la librería PIL/Pillow (instalable vía pip install Pillow) podés averiguar con un poco más de precisión la longitud de un texto para una fuente en particular con un tamaño determinado (Verdana 12, por ejemplo):

Código:
>>> from PIL import ImageFont
>>> font = ImageFont.truetype("verdana.ttf", size=12)
>>> font.getlength("Hola, mundo")
76.0     # Resultado en píxeles.

Te dejo la documentación sobre el método ImageFont.getlength().

Saludos
Responder
#5
Hola Francisco, buen día para todos.-
Gracias por el detalle(no lo había tenido en cuenta), aunque era tan solo una práctica
para lograr el código final, debo estar más atento.-
Bueno, al fin creo que este si es el óptimo, lo que necesitaba era obtener los píxeles del
ancho y alto de un widget Text, para que a partir de estos pudiera dimensionar
la ventana y el botón, lo que me ocurría es que no tenía en cuenta que el ancho se puede
medir con len y el alto es relativo a las filas.-
Obtenidos esas medidas fue sencillo pasarlo a píxeles.-
Dejo el código por si a alguien le sirve para sacarse alguna duda.-

Código:
#Establecer el ancho y el alto de la ventana relativo al widget TEXT.
    muestra_codigo.update_idletasks()
    width = muestra_codigo.winfo_width()
    height = muestra_codigo.winfo_height()
    centrar_ventana(t1, width, height)

Si comenzaba diciendo que necesitaba era el ancho y el alto
de un widget Text, todo se hubiera simplificado, pero no recordaba
que el Text no se configura en píxeles sino en cantidad de caracteres
y las filas, perdón.-

Muy buena la biblioteca que me sugeriste, ya estuve practicando.-
Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#6
Excelente, Daniel.

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)