Domanda

E 'possibile creare un'etichetta multilinea con a capo automatico che ridimensiona in sincronia con la larghezza del suo genitore? In altre parole il comportamento wordwrap di Blocco note come si cambia la larghezza della finestra del blocco note.

Il caso d'uso è una finestra di dialogo che deve presentare un blocco di più linee di testo (istruzioni) nella sua interezza senza avere il testo troncato o ricorrendo a scorrimento. Il contenitore padre avrà spazio verticale sufficiente per ospitare le larghezze strette.

Ho avuto modo di sperimentare con Tkinter Label e widget messaggio e il widget di TTK Label senza successo. Sembra che ho bisogno di codificare un pixel valore wraplength vs. hanno questi controlli automatica wordwrap quando il loro testo raggiunge il bordo destro della loro contenitori. Certamente manager Tkinters geometria mi può aiutare auto-ridimensionamento mie etichette e aggiornare i loro valori wraplength conseguenza?

dovrei esaminare il testo widget di invece? Se è così, è possibile nascondere il bordo di un widget di testo in modo da posso usarlo come un'etichetta multilinea con wordwrap?

Ecco un prototipo di come si possa fare quello che ho descritto sopra. E 'stato ispirato da punta di Bryan Oakley per utilizzare il widget di testo e il seguente post su StackOverflow: In Tkinter di pitone, come posso fare un'etichetta in modo tale che è possibile selezionare il testo con il 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()
È stato utile?

Soluzione

No, non c'è alcuna funzionalità incorporata per Tk alle etichette auto-word-wrap. Tuttavia, è fattibile legandosi all'evento <Configure> dell'etichetta e regolare la lunghezza dell'involucro poi. Questo legame sarà il fuoco ogni volta che l'etichetta widget è ridimensionata.

L'altra opzione, come lei suggerisce, è quello di utilizzare un widget di testo. E 'possibile disattivare del tutto la frontiera se lo desiderano. Questa è sempre stata la mia scelta quando voglio testo didattico a capo.

Altri suggerimenti

Message widget di :

  

Il messaggio widget è una variante del Label, progettato per visualizzare i messaggi su più righe. Il messaggio widget può disporre il testo e regolare la sua larghezza di mantenere un dato rapporto di aspetto.

Ecco il codice:

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 )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top