es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de mostrar correctamente los límites de las etiquetas en tkinter?

Estoy trabajando en una herramienta de marcado de texto usando tkinter. Está principalmente construida alrededor del uso de varios métodos de etiquetas en el widget Text. Lo que me vuelve loco, sin embargo, es mi incapacidad para obtener bordes correctos alrededor del texto etiquetado si hay etiquetas superpuestas.

Considera el siguiente fragmento de texto, etiquetado con dos etiquetas diferentes mostradas entre corchetes cuadrados: [my [example]].

Cuando uso .tag_configure(“outer”, borderwidth=1, relief=”solid”), quiero obtener un borde alrededor de “my example”, sin embargo, obtengo dos bordes: uno alrededor de “my” y otro alrededor de “example” si el color de fondo está establecido para “example”. Si no hay color de fondo involucrado, funciona como quiero. ¡Pero realmente necesito la capacidad de cambiar los colores de fondo!

Ejemplo mínimo de trabajo:

import tkinter as tk

class Application(tk.Frame):
def init(self, master):
super().init(master)

    self.grid(row=0, column=0, sticky=tk.N+tk.S+tk.W+tk.S)
    self.text = tk.Text(self)
    self.text.insert("1.0", "my example")

    self.text.tag_add("outer", "1.0", "end-1c")  # "my example"
    self.text.tag_configure("outer", borderwidth=1, relief="solid")

    self.text.tag_add("inner", "1.3", "end-1c")  # "example"
    self.text.tag_configure("inner", background="white")  # blanco para ver el problema mejor

    self.text.grid(row=0, column=0)

if name == “main“:
root = tk.Tk()
app = Application(root)
app.mainloop()

Pregunta: ¿hay alguna manera (posiblemente ingeniosa) de obtener bordes individuales alrededor de esas etiquetas “outer”?

Lo que quiero: |my example|

Lo que obtengo: |my |example|

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es causado por la forma en que el widget de texto en tkinter maneja las etiquetas superpuestas. Aunque puede haber algunas soluciones poco convencionales, una solución más elegante sería utilizar un enfoque diferente por completo.

    Una posible solución es dividir el texto en fragmentos separados y crear un widget de texto individual para cada fragmento. Luego, aplicar las etiquetas a cada widget de texto de forma individual. De esta manera, no habría superposición entre las etiquetas y se podrían evitar múltiples bordes.

    Otra solución es utilizar un widget diferente que sea más adecuado para la edición de texto, como el widget ScrolledText de tkinter.scrolledtext. Este widget admite el formato utilizando etiquetas de estilo HTML, lo cual puede ser más fácil de manejar que el widget de texto incorporado.

    En general, el mejor enfoque puede depender de los requisitos y limitaciones específicas del proyecto.

Comments are closed.