Créer des étiquettes Tkinter / ttk redimensionnables / multilignes avec un retour à la ligne

Est-il possible de créer une étiquette multiligne avec un retour à la ligne redimensionné en synchronisation avec la largeur de son parent? En d’autres termes, le comportement de Notepad en termes de mot-clé lorsque vous modifiez la largeur de la fenêtre du Bloc-notes.

Le cas d’utilisation est une boîte de dialog qui doit présenter un bloc de texte multi-lignes (instructions) dans son intégralité sans que le texte ne soit écrêté ni utilisé dans les barres de défilement. Le conteneur parent aura suffisamment d’espace vertical pour accueillir des largeurs étroites.

J’ai expérimenté avec succès les widgets Tkinter Label et Message et le widget ttk Label. Il semble que je doive coder en dur une valeur de longueur de pixel par rapport au fait que ces commandes contrôlent automatiquement le mot quand leur texte atteint le bord droit de leur conteneur. Les gestionnaires de géomésortinge de Tkinters peuvent certainement m’aider à redimensionner automatiquement mes étiquettes et à mettre à jour leurs valeurs de longueur d’onde en conséquence?

Dois-je plutôt regarder le widget Texte? Si c’est le cas, est-il possible de masquer la bordure d’un widget de texte afin de pouvoir l’utiliser en tant qu’étiquette multi-lignes avec WordWrap?

Voici un prototype de la façon dont on pourrait faire ce que j’ai décrit ci-dessus. Il a été inspiré par le truc de Bryan Oakley pour utiliser le widget Text et le post suivant sur Stackoverflow: Dans tkinter de python, comment puis-je créer un Label pour pouvoir sélectionner le texte avec la souris?

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. """.ssortingp() 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() 

Non, il n’y a pas de fonctionnalité intégrée à Tk pour les étiquettes à retour automatique. Cependant, il est réalisable en liant à l’événement de l’étiquette et en ajustant la longueur de l’emballage. Cette liaison se déclenche à chaque redimensionnement du widget d’étiquette.

L’autre option, comme vous le suggérez, consiste à utiliser un widget texte. Il est possible d’éteindre complètement la frontière si vous le désirez. Cela a toujours été mon choix quand je veux un texte d’instruction enveloppé de mots.

Utilisez le widget Message :

Le widget Message est une variante de l’étiquette conçue pour afficher des messages multilignes. Le widget de message peut envelopper le texte et ajuster sa largeur pour conserver un ratio 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("", y )