blog.furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

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()
Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury