Pregunta

¿Es posible crear una etiqueta multilínea con ajuste de línea que cambia el tamaño en sincronía con la anchura de su padre? En otras palabras, el comportamiento de ajuste de línea de Bloc de notas a medida que cambia el ancho de la ventana del Bloc de notas.

El caso de uso es un cuadro de diálogo que las necesidades que presente un bloque de texto de líneas múltiples (instrucciones) en su totalidad sin tener el texto recortado o recurrir a barras de desplazamiento. El contenedor primario tendrá suficiente espacio vertical para acomodar anchuras estrechas.

He estado experimentando con Tkinter Etiqueta y widgets de mensajes y el widget TTK etiqueta sin éxito. Parece que tengo que codificar un pixel valor wraplength vs. tener estos controles de ajuste de línea automático cuando el texto llega al borde derecho de sus contenedores. Ciertamente, los administradores Tkinters geometría me puede ayudar de cambio de tamaño mis etiquetas y actualizar sus valores wraplength en consecuencia?

debo buscar en el texto del widget en su lugar? Si es así, ¿es posible ocultar el borde de un widget de texto para que pueda utilizarlo como una etiqueta multilínea con ajuste de línea?

Aquí hay un prototipo de cómo se puede hacer lo que he descrito anteriormente. Se inspira en la punta de Bryan Oakley utilizar el widget de texto y el siguiente mensaje el Stackoverflow: En tkinter de pitón, ¿cómo puedo hacer una etiqueta de tal manera que se puede seleccionar el texto con el ratón?

from Tkinter import *
master = Tk()

text = """
If tkinter is 8.5 or above you'll want the selection background to appear like it does when the widget is activated. Comment this out for older versions of Tkinter.

This is even more text.

The final line of our auto-wrapping label that supports clipboard copy.
""".strip()

frameLabel = Frame( master, padx=20, pady=20 )
frameLabel.pack()
w = Text( frameLabel, wrap='word', font='Arial 12 italic' )
w.insert( 1.0, text )
w.pack()

# - have selection background appear like it does when the widget is activated (Tkinter 8.5+)
# - have label background color match its parent background color via .cget('bg')
# - set relief='flat' to hide Text control borders
# - set state='disabled' to block changes to text (while still allowing selection/clipboard copy)
w.configure( bg=master.cget('bg'), relief='flat', state='disabled' )

mainloop()
¿Fue útil?

Solución

No, no hay ninguna característica incorporada para Tk para etiquetas auto-word-wrap. Sin embargo, es factible mediante la unión al evento <Configure> de la etiqueta y el ajuste de la longitud de enrollamiento a continuación. Esta unión se dispara cada vez que la etiqueta widget es redimensionada.

La otra opción, como usted sugiere, es el uso de un widget de texto. Es posible convertir completamente fuera de la frontera si así lo desea. Esto siempre ha sido mi elección cuando quiero texto de instrucciones palabra-envuelta.

Otros consejos

Message widget de :

  

El Mensaje widget es una variante de la etiqueta, diseñada para mostrar mensajes de varias líneas. El mensaje de control puede ajustar el texto, y ajustar su anchura para mantener una relación de aspecto dada.

Este es el código:

entry = Label(self, text=text,
    anchor=NW, justify=LEFT,
    relief=RIDGE, bd=2)
def y(event, entry=entry):
  # FIXME: make this a global method, to prevent function object creation
  # for every label.
  pad = 0
  pad += int(str(entry['bd']))
  pad += int(str(entry['padx']))
  pad *= 2
  entry.configure(wraplength = event.width - pad)
entry.bind("<Configure>", y )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top