2017-12-29 34 views
0

Ich habe eine Anzahl von Referenzen sowohl auf Stackoverflow und anderen Orten (Effbot, etc.) angeschaut. Ich war in der Lage, den Rahmen auf einer Leinwand mit den Scrollbars zu bekommen, aber es kann nicht zum Scrollen kommen. enter image description hereTkinter: Bildlaufleisten erscheinen aber funktionieren nicht

In diesem Beispiel möchte ich den Rahmen mit den Entry-Widgets scrollen. Ich habe eine andere (reale) Anwendung, die eine große Anzahl von Eintritts-Widgets hat, die dazu führen, dass der Rahmen die Höhe seines Elternteils überschreitet.

# **** SCROLL BAR TEST ***** 
from tkinter import * 
from tkinter import ttk 

root = Tk() 
root.title("Scrollbar Test") 
root.geometry("800x400") 
root.configure(background="light gray") 

frame = Frame(root, height=300, width = 200, borderwidth=2, relief=SUNKEN, background="light gray") 
frame.grid(column=0, row=0, sticky=W) 


yscrollbar = Scrollbar(frame) 
yscrollbar.grid(column=1, row=2, sticky=N+S) 


canvas = Canvas(frame, bd=0, scrollregion=(0,0,800, 600), yscrollcommand=yscrollbar.set) 
canvas.grid(column=0, row=0, sticky=N+S+E+W) 

yscrollbar.config(command=canvas.yview) 

frame = Frame(canvas, height=300, width = 200, borderwidth=2, relief=SUNKEN, background="light gray") 
frame.grid(column=0, row=0, sticky=W) 

label = ttk.Label(frame, text="This is a label") 
label.grid(column=1, row=0, sticky=W) 

text = ttk.Entry(frame, textvariable="text") 
text.grid(column=2, row=0, sticky=W) 


label1= ttk.Label(frame, text="This is a label") 
label1.grid(column=1, row=1, sticky=W) 

text1 = ttk.Entry(frame, textvariable="text") 
text1.grid(column=2, row=1, sticky=W) 

label2 = ttk.Label(frame, text="This is a label") 
label2.grid(column=1, row=2, sticky=W) 

text2 = ttk.Entry(frame, textvariable="text") 
text2.grid(column=2, row=2, sticky=W) 

label3 = ttk.Label(frame, text="This is a label") 
label3.grid(column=1, row=3, sticky=W) 

text3 = ttk.Entry(frame, textvariable="text") 
text3.grid(column=2, row=3, sticky=W) 

label4 = ttk.Label(frame, text="This is a label") 
label4.grid(column=1, row=4, sticky=W) 

text4 = ttk.Entry(frame, textvariable="text") 
text4.grid(column=2, row=4, sticky=W) 

label5 = ttk.Label(frame, text="This is a label") 
label5.grid(column=1, row=5, sticky=W) 

text5 = ttk.Entry(frame, textvariable="text") 
text5.grid(column=2, row=5, sticky=W) 

label6 = ttk.Label(frame, text="This is a label") 
label6.grid(column=1, row=6, sticky=W) 

text6 = ttk.Entry(frame, textvariable="text") 
text6.grid(column=2, row=6, sticky=W) 

label7 = ttk.Label(frame, text="This is a label") 
label7.grid(column=1, row=7, sticky=W) 

text7 = ttk.Entry(frame, textvariable="text") 
text7.grid(column=2, row=7, sticky=W) 

label8 = ttk.Label(frame, text="This is a label") 
label8.grid(column=1, row=8, sticky=W) 

text8 = ttk.Entry(frame, textvariable="text") 
text8.grid(column=2, row=8, sticky=W) 

label9 = ttk.Label(frame, text="This is a label") 
label9.grid(column=1, row=9, sticky=W) 


text9 = ttk.Entry(frame, textvariable="text") 
text9.grid(column=2, row=9, sticky=W) 



root.mainloop() 
+0

Sie können keine Objekte scrollen, die mit "pack", "place" oder "grid" zu einer Leinwand hinzugefügt wurden. Lesen Sie https://StackOverflow.com/a/3092341/7432 für ein Beispiel –

Antwort

0

Zuerst sollte die Bildlaufleiste in der gleichen Zeile wie die Leinwand platziert werden.

Zweitens ist das Festlegen der Höhe und Breite eines Frames sinnlos, da diese durch die Größe der Child-Attribute überschrieben werden.

Drittens werden Elemente zu einem Canvas mit der create_window-Methode hinzugefügt, nicht grid().

Weiter müssen Sie anstelle der Einstellung der Bildlaufleiste eine Funktion hinzufügen, die sie basierend auf der Bildgröße aktualisiert.

Alle zusammen:

# **** SCROLL BAR TEST ***** 
from tkinter import * 
from tkinter import ttk 

def _on_frame_configure(self, event=None): 
    canvas.configure(scrollregion=canvas.bbox("all")) 

root = Tk() 
root.title("Scrollbar Test") 
root.geometry("800x400") 
root.configure(background="light gray") 

frame = Frame(root, borderwidth=2, relief=SUNKEN, background="light gray") 
frame.grid(column=0, row=0, sticky=N+S+E+W) 


yscrollbar = Scrollbar(frame) 
yscrollbar.grid(column=1, row=0, sticky=N+S) 

canvas = Canvas(frame, bd=0, yscrollcommand=yscrollbar.set) 
canvas.grid(column=0, row=0, sticky=N+S+E+W) 

yscrollbar.config(command=canvas.yview) 

frame = Frame(canvas, borderwidth=2, relief=SUNKEN, background="light gray") 
canvas.create_window(4, 4, window=frame, anchor='nw') 
frame.bind("<Configure>", _on_frame_configure) 

for i in range(30): 
    label = ttk.Label(frame, text="This is a label "+str(i)) 
    label.grid(column=1, row=i, sticky=W) 

    text = ttk.Entry(frame, textvariable="text") 
    text.grid(column=2, row=i, sticky=W) 

root.mainloop() 

Oder benutzen Sie einfach einen gescrollt Rahmen, dass jemand bereits gemacht hat, like this one that I made awhile ago.

Verwandte Themen