Erstellen resizable / mehrzeilige Tkinter / ttk Labels mit Zeilenumbruch
Frage
Ist es möglich, ein mehrzeiliges Etikett mit Zeilenumbruch zu erzeugen, die mit der Breite der übergeordneten synchron ändern die Größe? Mit anderen Worten: der Editor die wordwrap Verhalten, wie Sie die Breite der Editor-Fenster ändern.
Der Anwendungsfall ist ein Dialog, braucht einen Block von mehrzeiligen Text (Anweisungen) in ihrer Gesamtheit darzustellen der Text abgeschnitten, ohne oder mit Bildlaufleisten zurückzugreifen. Der übergeordnete Container genügend vertikalen Raum hat schmale Breite aufzunehmen.
Ich habe mit Tkinter Label-und Message-Widgets zu experimentieren und TTK Label-Widget ohne Erfolg. Es scheint, dass ich zu hart Code benötigen ein Pixel wraplength Wert gegen diese Kontrollen Auto wordwrap haben, wenn ihr Text den rechten Rand ihrer Behälter erreicht. Sicherlich Tkinters Geometry-Manager kann mir helfen, meine Etiketten automatisch die Größe und ihre wraplength Werte entsprechend aktualisieren?
Soll ich im Text suchen Widget statt? Wenn ja, ist es möglich, die Grenze eines Text-Widget zu verstecken, damit ich es als ein mehrzeiliges Etikett mit wordwrap verwenden kann?
Hier ist ein Prototyp, wie könnte man tun, was ich oben beschrieben. Es wurde von Bryan Oakley Spitze inspiriert auf Stackoverflow den Text-Widget und die folgende Post zu verwenden:
Lösung Nein, es gibt keine Funktion eingebaut, um Tk Auto-word-wrap Etiketten. Allerdings ist es machbar, indem auf das Die andere Option, wie Sie vorschlagen, ist ein Text-Widget zu verwenden. Es ist möglich, vollständig die Grenze zu deaktivieren, wenn Sie dies wünschen. Das hat meine Wahl immer, wenn ich Wort umwickelten Anleitungstext soll. <Configure>
Ereignis des Etiketts Bindung und dann die Wrap-Länge eingestellt werden. Diese Bindung wird jedes Mal das Label Feuer-Widget Größe verändert wird.
Andere Tipps
Verwenden Sie Message
Widget :
Die Nachricht Widget eine Variante des Label ist, entworfen mehrzeilige Nachrichten anzuzeigen. Die Nachricht Widget Text wickeln kann, und stellen Sie die Breite eines gegebenen Seitenverhältnis beizubehalten.
Hier ist der Code:
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 )