Créer redimensionnables / multiligne Tkinter / TTK étiquettes avec retour à la ligne
Question
Est-il possible de créer une étiquette à plusieurs lignes avec retour à la ligne qui redimensionne en phase avec la largeur de son parent? En d'autres termes, le comportement wordwrap du Bloc-notes que vous changez la largeur de la fenêtre NotePad.
Le cas d'utilisation est une boîte de dialogue qui doit présenter un bloc de texte à lignes multiples (instructions) dans son intégralité, sans avoir coupé le texte ou le recours à des barres de défilement. Le conteneur parent aura suffisamment d'espace vertical pour accueillir des largeurs étroites.
Je l'ai expérimenté avec Label Tkinter et widgets message et le widget Label TTK sans succès. Il semble que je dois coder en dur une valeur wraplength pixel par rapport à ces contrôles ont wordwrap automatique lorsque leur texte atteint le bord droit de leurs conteneurs. Tkinters Certes, les gestionnaires de géométrie peuvent me aider auto-redimensionner mes étiquettes et mettre à jour leurs valeurs wraplength en conséquence?
Dois-je regarderais le widget texte à la place? Si oui, est-il possible de cacher la bordure d'un widget texte que je peux l'utiliser comme une étiquette à plusieurs lignes avec wordwrap?
Voici un prototype de la façon dont on pourrait faire ce que je décrit ci-dessus. Il a été inspiré par la pointe de Bryan Oakley utiliser le widget texte et le message suivant sur Stackoverflow:
La solution Non, il n'y a pas fonctionnalité intégrée pour Tk aux étiquettes auto-wrap-mot. Cependant, il est faisable en se liant à l'événement L'autre option, comme vous le suggérez, est d'utiliser un widget texte. Il est possible de désactiver entièrement la frontière si vous le désirez. Cela a toujours été mon choix quand je veux texte d'instruction enveloppé mot. <Configure>
de l'étiquette et le réglage de la longueur de la pellicule puis. Cette liaison se déclenche chaque fois que le widget étiquette est redimensionnée.
Autres conseils
Le widget du message est une variante de l'étiquette, conçu pour afficher des messages multilignes. Le widget de message peut placer le texte, et d'ajuster sa largeur pour maintenir un rapport d'aspect donné.
Voici le 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 )