Przykład przewijanej ramki `Frame` w Tkinter
To jest „przedruk” mojej wypowiedzi na polskim forum Pythona http://pl.python.org/forum/index.php?topic=4366.msg18701#msg18701
Rzeczywiście pytanie jest trudniejsze bo w Tkinter
(w
przeciwieństwie do innych GUI) nie ma jakieś specjalnej ramki, której
zawartość dało by się przewijać. Zdaje się, że jedyne elementy jakie da
się przewijać to ListBox, Text i Canvas ("płótno"). Z pomocą tego
ostatniego da się problem obejść.
W przykładzie zadałem rozmiary ramkom aby ramka wewnętrzna była większa od zewnętrznej i było co przewijać.
#-*- coding: utf-8 -*-
from tkinter import *
root = Tk()
# ramka zewnętrzna - zadałem wymiary ręcznie aby była mniejsza od ramki wewnętrznej
scrollframe = Frame(root)
scrollframe.place(x=3, y=3, width=100, height=150)
# pasek przewijania pionowego - z prawej strony
yscrollbar = Scrollbar(scrollframe, orient="vertical")
yscrollbar.pack(side=RIGHT, fill=Y)
# pasek przewijania poziomego - u dołu
xscrollbar = Scrollbar(scrollframe, orient="horizontal")
xscrollbar.pack(side=BOTTOM, fill=X)
# przewijane "płótno" (połączone z paskami przewijania) - z lewej strony
canvas = Canvas(scrollframe, yscrollcommand=yscrollbar.set, xscrollcommand=xscrollbar.set)
canvas.pack(side=LEFT, fill=BOTH)
# połączenie pasków przewijania z płótnem
yscrollbar.config(command=canvas.yview)
xscrollbar.config(command=canvas.xview)
# ramka wewnętrzna - zadałem wymiary ręcznie aby była większa od ramki zewnętrznej
innerframe = Frame(canvas, width=150, height=250)
# umieszczenie ramki wewnętrznej na płótnie (nw = north west = lewy, gorny róg)
canvas.create_window((0,0), window=innerframe, anchor='nw')
# elementy w wewnętrznej ramce
Label(innerframe, text="LABEL 1").pack()
Entry(innerframe).pack()
Label(innerframe, text="LABEL 2").pack()
Entry(innerframe).pack()
Label(innerframe, text="LABEL 3").pack()
Entry(innerframe).pack()
Label(innerframe, text="LABEL 4").pack()
Entry(innerframe).pack()
Label(innerframe, text="LABEL 5").pack()
Entry(innerframe).pack()
# przeliczenie wymiarów płótna według elementów na niej zawartych
canvas.configure(scrollregion=canvas.bbox("all"))
root.mainloop()
If you like it
Buy a Coffee
Buy a Coffee