2010-12-12 8 views
1

Je voudrais créer une zone de texte déroulante Tkinter qui remplisse l'espace alloué maximum. Je l'ai un peu de travail ...Redimensionnement d'une zone de texte Tkinter défilée

Pour une raison quelconque lorsque j'étire la fenêtre, le widget de texte est bien; Cependant, la barre de défilement obtient une tonne de remplissage sur l'axe des x.

Le deuxième problème est lorsque je rétrécis la fenêtre, la barre de défilement va de l'écran.

Quelqu'un connaît les solutions à ces deux programmes?

extrait:

self.Fr = Tkinter.Frame(self, width=self.Wi, height=self.He) 
    self.Fr.pack(side='right', fill='both', expand='yes') 


    self.Te = Tkinter.Text(self.Fr, font=self.Fo, fg=self.FG, bg=self.BG, 
          selectforeground=self.SFG, 
          selectbackground=self.SBG, 
          insertbackground=self.IBG, wrap='word', 
          undo=True, maxundo=100) 
    #self.Te.grid(column=0, row=0, sticky='NSEW') 
    self.Te.pack(side='left', fill='both', expand='yes') 


    self.Sc = Tkinter.Scrollbar(self.Fr, elementborderwidth=1) 
    #self.Sc.grid(column=1, row=0, sticky='NSEW') 
    self.Sc.pack(side='right', fill='both', expand='yes') 

    self.Te.configure(yscrollcommand=self.Sc.set) 
    self.Sc.configure(command=self.Te.yview) 

Répondre

6

Votre scrollbar obtient tout le rembourrage parce que vous utilisez fill='both'. Bien qu'il s'agisse d'une barre de défilement verticale, vous lui avez demandé de prendre de l'espace supplémentaire le long de l'axe x, ce qui entraîne le remplissage puisque la barre de défilement elle-même ne s'étire pas pour faire une barre de défilement large. Vous voulez que les barres de défilement verticales ne remplissent que la direction Y et horizontales pour remplir la direction X. En ce qui concerne la barre de défilement qui sort de l'écran, c'est un peu compliqué à expliquer, mais il a une solution simple.

Le problème est le suivant: si vous réduisez une fenêtre gérée par pack à un point où elle est plus petite que celle requise par les widgets à l'intérieur, elle commence à écrêter les widgets. La façon dont cela fonctionne est de traiter les widgets dans l'ordre, de disposer la fenêtre et d'allouer tout espace restant pour les widgets restants. Cela signifie que si un widget au début de l'ordre occupe tout l'espace visuel restant, les widgets ultérieurs n'apparaîtront pas.

La "commande" mentionnée ci-dessus est l'ordre de la liste de colisage. Plus précisément, l'ordre dans lequel les éléments ont été emballés. Donc, si vous empaquetez le widget texte, la barre de défilement Tk affichera d'abord le widget texte, et tout espace restant sera alloué à la barre de défilement. Si vous avez d'abord placé la barre de défilement, elle sera disposée et tout espace restant sera donné au widget de texte.

Tout cela semble très complexe, mais ce qui est cool, c'est que si tout est rangé dans le bon ordre, tout fonctionne.

La règle générale est de s'assurer que le dernier widget que vous avez empaqueté est celui avec expand défini sur true. Ceci est votre widget "élastique". De cette façon, tous les widgets de taille fixe prendront l'espace dont ils ont besoin en premier, et votre widget "élastique" prendra tout ce qui reste.

Il existe une autre solution qui consiste à donner à votre widget de texte une largeur et une hauteur de un. Avec cela, lorsque l'emballeur alloue initialement de l'espace, il n'alloue qu'une petite quantité d'espace. Ainsi, lorsque la fenêtre se rétrécit, le widget de texte rétrécit jusqu'à ce qu'il atteigne cette taille minuscule. Ce n'est pas très pratique, car l'une des grandes caractéristiques de pack est que vous pouvez donner à tous les widgets leur taille naturelle (ou ils prennent leur taille naturelle en fonction de leur contenu dans le cas des boutons et des étiquettes) et l'emballeur fait tout l'oeuvre. Si vous définissez la largeur et la hauteur à un, votre fenêtre initiale (à moins qu'elle ne soit explicitement définie sur une taille plus grande) sera plutôt petite.

Ce comportement est entièrement documenté dans la page de manuel du pack, bien que vous deviez le lire de très près pour bien comprendre ce comportement.

+0

Wow, c'est une très bonne information. J'avais principalement travaillé avec les méthodes .grid et .place. Par conséquent, je n'avais qu'une vague compréhension de la façon dont la méthode .pack fonctionnait. Cela a certainement éclairci mes malentendus. – rectangletangle

Questions connexes