Pergunta

É possível criar um rótulo de várias linhas com Word Wrap que redimensione em sincronia com a largura de seus pais? Em outras palavras, o comportamento do WordWrap do bloco de notas ao mudar a largura da janela do bloco de notas.

O caso de uso é uma caixa de diálogo que precisa apresentar um bloco de texto com várias linhas (instruções) na íntegra sem ter o texto preso ou recorrendo às barras de rolagem. O contêiner pai terá espaço vertical suficiente para acomodar larguras estreitas.

Eu tenho experimentado o rótulo Tknter e os widgets de mensagem e o widget de etiqueta TTK sem sucesso. Parece que eu preciso codificar um valor de wordwrap de wordwrap de pixels de wordwrap quando seu texto atingir a borda direita de seus contêineres. Certamente, os gerentes de geometria da Tkinters podem me ajudar a resistir automaticamente meus rótulos e atualizar seus valores de wraplel comprimento de acordo?

Devo estar olhando para o widget de texto? Nesse caso, é possível ocultar a borda de um widget de texto para que eu possa usá-lo como um rótulo de várias linhas com o WordWrap?

Aqui está um protótipo de como alguém pode fazer o que descrevi acima. Foi inspirado na ponta de Bryan Oakley para usar o widget de texto e a seguinte postagem no Stackoverflow:No tknter do Python, como posso fazer uma etiqueta para que você possa selecionar o texto com o mouse?

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()
Foi útil?

Solução

Não, não há nenhum recurso embutido no TK para rótulos de gravação de palavras automáticas. No entanto, é factível pela ligação ao <Configure> evento do rótulo e ajustando o comprimento do invólucro. Essa ligação dispara sempre que o widget de etiqueta é redimensionado.

A outra opção, como você sugere, é usar um widget de texto. É possível desligar completamente a fronteira, se você deseja. Essa sempre foi minha escolha quando quero texto instrucional embrulhado por palavras.

Outras dicas

Usar Message ferramenta:

O widget de mensagem é uma variante do rótulo, projetada para exibir mensagens multilinas. O widget da mensagem pode envolver o texto e ajustar sua largura para manter uma determinada proporção.

Aqui está o 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top