2010-12-12 15 views
1

Ich möchte, dass a ein gescrolltes Tkinter-Textfeld erstellt, das den maximal zugewiesenen Speicherplatz ausfüllt. Ich habe es funktioniert Art von ...Ändern der Größe eines gescrollten Tkinter-Textfelds

Aus irgendeinem Grund, wenn ich das Fenster dehnen das Text-Widget ist in Ordnung; Die Bildlaufleiste erhält jedoch eine Menge Padding auf der x-Achse.

Das zweite Problem ist, wenn ich das Fenster schrumpfen die Bildlaufleiste des Bildschirms geht.

Wer kennt die Lösungen für diese beiden Programme?

Schnipsel:

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) 

Antwort

6

Ihre Scrollbar erhält die ganze Polsterung, weil Sie fill='both' verwenden. Obwohl es sich um eine vertikale Bildlaufleiste handelt, haben Sie sie aufgefordert, zusätzlichen Platz entlang der x-Achse zu belegen. Dies führt zu einer Auffüllung, da die Bildlaufleiste selbst nicht gedehnt wird, um eine breite Bildlaufleiste zu erstellen. Sie möchten, dass vertikale Bildlaufleisten nur die Y-Richtung ausfüllen und horizontale, um die X-Richtung zu füllen.

In Bezug auf die Bildlaufleiste gehen Bildschirm, das ist ein wenig kompliziert zu erklären, aber es hat eine einfache Lösung.

Das Problem ist das: Wenn Sie ein Fenster, das von pack verwaltet wird, zu einem Punkt verkleinern, der kleiner ist als das, was von den Widgets benötigt wird, beginnt es, Widgets zu schneiden. Die Art und Weise, wie dies funktioniert, ist die Verarbeitung der Widgets in der Reihenfolge, das Auslegen des Fensters und das Zuweisen von verbleibendem Platz für verbleibende Widgets. Dies bedeutet, dass wenn ein Widget früh in der Reihenfolge den gesamten verbleibenden visuellen Platz einnimmt, keine späteren Widgets angezeigt werden.

Die oben genannte "Bestellung" ist die Reihenfolge der Packliste. Insbesondere die Reihenfolge, in der die Artikel gepackt wurden. Wenn Sie also das Text-Widget packen, wird das Text-Widget zuerst mit der Bildlaufleiste Tk angelegt und der verbleibende Platz wird der Bildlaufleiste zugewiesen. WENN du die Bildlaufleiste zuerst gepackt hättest, würde sie ausgebreitet werden und der verbleibende Platz würde dem Text-Widget zugewiesen werden.

Es klingt alles sehr komplex, aber das Tolle ist, dass alles funktioniert, wenn man die Dinge in die richtige Reihenfolge packt.

Die allgemeine Faustregel lautet also, sicherzustellen, dass das letzte Widget, das Sie packen, das mit expand auf true ist. Dies ist dein "elastisches" Widget. Auf diese Weise nehmen alle Widgets mit fester Größe den Platz ein, den sie als erstes benötigen, und Ihr "elastisches" Widget nimmt alles auf, was übrig ist.

Es gibt eine andere Lösung, die Ihrem Text-Widget eine gewünschte Breite und Höhe von eins geben soll. Wenn der Packer zu Anfang Speicherplatz reserviert, weist er nur wenig Speicherplatz zu. Wenn das Fenster verkleinert wird, verkleinert sich das Text-Widget, bis es auf diese winzige Größe reduziert wird. Dies ist jedoch nicht sehr praktisch, da eine der großen Eigenschaften von Pack ist, dass Sie allen Widgets ihre natürliche Größe geben können (oder sie nehmen ihre natürliche Größe basierend auf ihrem Inhalt im Falle von Buttons und Labels an) und der Packer macht alles die Arbeit. Wenn Sie die Breite und Höhe auf eins festlegen, ist Ihr Anfangsfenster (sofern nicht explizit auf eine größere Größe festgelegt) ziemlich klein.

Dieses Verhalten ist alles in der Manpage für Pack dokumentiert, obwohl Sie es wirklich genau lesen müssen, um dieses Verhalten vollständig zu erfassen.

+0

Wow, das sind einige wirklich gute Infos. Ich hatte hauptsächlich mit den .grid und .place-Methoden gearbeitet. Daher hatte ich nur eine vage Vorstellung davon, wie die .pack-Methode funktionierte. Das hat meine Missverständnisse sicherlich geklärt. – rectangletangle

Verwandte Themen