2017-11-13 4 views
0

Wenn ich text_area.pack() vor scrollbar.pack() aufrufen (d. H. Sie wechseln), wird die Bildlaufleiste nicht angezeigt. Warum das? Wenn ich ein größeres Programm erstellen möchte, hätte ich absolut keine Chance herauszufinden, wo das Problem liegt.Tkinter Scrollbar

from tkinter import * 
import tkinter.filedialog 



root = Tk() 
root.geometry("200x100") 
frame = Frame(root,width=150, height=90) 
frame.pack() 
scrollbar = Scrollbar(frame) 
text_area = Text(frame, width=200, height=50,yscrollcommand=scrollbar.set) 
scrollbar.config(command=text_area.yview) 
scrollbar.pack(side="right", fill="y") 
text_area.pack() 
root.mainloop() 
+0

Als Bryan wies darauf hin, wenn Sie anrufen 'root.geometry (" 200x100 ")' du überlegst irgendwelche Größenanforderungen darin. Das ist auch der Grund, warum Sie die Bildlaufleiste sehen können, wenn das Fenster erweitert wird, vorausgesetzt, Sie haben eine ausreichend große Umgebung. Kommentiere es, um zu sehen, was passiert. – Nae

Antwort

0

Wenn Sie sie einschalten, scrollbar.pack() einfach ist nicht bewusst, dass es oben gehen muss, stattdessen geht es weiter von oben nach unten, und rechts. Sie können das sehen, wenn Sie die Fenstergröße erweitern.

Sie können das Problem beheben, indem Sie ersetzen:

text_area.pack() 

mit:

text_area.pack(side="left") 

Wenn Sie komplexere Geometrie Strukturen entwerfen ich Sie grid statt pack verwenden würde vorschlagen.

+0

Ich habe text_area ersetzt.pack() mit text_are.pack (side = "left"), hat sie getauscht und die Bildlaufleiste wird immer noch nicht angezeigt. Auch wenn ich versuche, die Größe des Fensters usw. Hier ist der Code: von tkinter import * Import tkinter.filedialog root = Tk() root.geometry ("200x100") frame = Frame (Wurzel, Breite = 150, Höhe = 90) frame.pack() scrollbar = Scrollbar (Rahmen) text_area = Text (Rahmen, Breite = 200, Höhe = 50, yscrollcommand = scrollbar.set) scrollbar.config (command = text_area .yview) text_area.pack (side = "left") scrollbar.pack (side = "rechts", fill = "y") root.mainloop() –

2

Der Grund dafür, dass die Bildlaufleiste nicht angezeigt wird, ist, dass dafür einfach kein Platz ist. Sie geben eine Fenstergröße von 200x100 Pixel und eine innere Rahmengröße von 150x90 Pixel an, aber Sie versuchen, ein viel größeres Text-Widget in diesem Bereich zu platzieren. Sie geben eine Größe von 200x50 Zeichen an (ungefähr 1400x750, abhängig von den verwendeten Schriften), die viel zu breit für den verfügbaren Platz ist. Der Weg pack funktioniert so, dass er den verfügbaren Platz betrachtet, das Widget in diesen Raum einfügt und die Abstände, die für dieses Widget benötigt werden, von dem für das nächste Widget verfügbaren Platz subtrahiert. Da Sie das Text-Widget zuerst platziert haben und mehr als den verfügbaren Speicherplatz angefordert haben, hat es den gesamten verfügbaren Speicherplatz belegt. Dann, wenn Sie pack auf der Bildlaufleiste aufrufen, gibt es einfach nirgends, es zu setzen.

Wenn Sie die Reihenfolge umkehren, nimmt die Scrollbar nur einen Bruchteil des zur Verfügung stehenden Platzes, so gibt es viele Möglichkeiten, den Text Widget in.

Die beste Lösung zu passen ist die Reihenfolge zu ändern, in dem Sie pack nennen. Im Allgemeinen rufen Sie am besten pack an, damit das letzte Widget, das Sie pack nennen, der "Held" ist - derjenige, der den gesamten verbleibenden Platz einnimmt und mit dem Wachstum und Schrumpfen des Fensters wächst oder schrumpft. Normalerweise ist das ein Text-Widget oder ein Canvas-Widget oder ein Frame, der selbst viele Widgets enthält.

Der Schlüssel zum Erfolg mit tkinter ist, nicht zu versuchen, ein tkinter Widget oder Fenster zu einer bestimmten Größe in Pixeln zu zwingen (außer vielleicht für den Canvas). Stattdessen lassen Sie entweder ein Widget seine Standardgröße verwenden (insbesondere mit Schaltflächen und Bildlaufleisten) oder wählen Sie einen sinnvollen Standardwert (Anzahl der Zeilen und/oder Spalten). Tkinter berechnet dann die richtige Größe, um alles basierend auf der Schriftart, der Bildschirmauflösung und anderen Faktoren anzupassen.

0

Die anderen 2 Antworten sind wirklich gut - ich dachte, ich würde ein Beispiel hinzufügen. Ich persönlich mag es nicht verwenden .pack - Ich mag Dinge zu setzen, anstatt wie folgt aus: self.set_label_logpage.place(x=175, y=100)

Beispielcode:

faultlogframe_logs = tk.Label(self, textvariable=logging_screen_label, font=Roboto_Normal_Font, 
            height=180, width=400, background='white', foreground='black') 

faultlogframe_logs.place(x=605, y=600) 

self.scrollbar = Scrollbar(self, orient=VERTICAL, elementborderwidth=4, width=32) 
self.scrollbar.pack(pady=60,padx=0, ipady=4, ipadx=4, side=RIGHT, fill=Y) 
self.scrollbar_y = Scrollbar(self, orient=HORIZONTAL, width=12, takefocus=1) 
self.scrollbar_y.pack(expand=TRUE, ipady=9, ipadx=9, padx=0, pady=0, side=BOTTOM, fill=X, anchor=S) 

self.set_label_logpage = tk.Listbox(self, yscrollcommand=self.scrollbar.set, xscrollcommand=self.scrollbar_y.set) 
self.set_label_logpage.config(font=Roboto_Normal_Font, background='white', foreground='black', height=16, width=55) #textvariable=self.label_to_display_log 
self.set_label_logpage.place(x=175, y=100) 

self.scrollbar_y.config(command=self.set_label_logpage.xview) 
self.scrollbar.config(command=self.set_label_logpage.yview)