Scrollable Frame i zmiana rozmiaru okna

0

Hej chcialbym stworzyc Frame ze scrollbarem, i w srodku tego Frame'a chcialbym umiescic duzo Buttonow (5 kolumn) w taki sposob zeby ich rozmiar dopasowal sie do rozmiaru okna czyli jak zmienie rozmiar okna to przyciki rowniez sie zmienia tak aby wypelnic cale okno. Oto moj obecny kod ale ani Scrollbar nie dziala ani przyciki nie wypelniaja ladnie calego okna. Co powinienem zmienic?

from tkinter import *
from tkinter import ttk

class MainView(Frame):

    def FrameHeight(self, event):
        canvas_height = event.height
        canvas_width = event.width

        self.canvas.itemconfig(self.canvas_frame, height = canvas_height)
        self.canvas.itemconfig(self.canvas_frame, width = canvas_width)

    def OnFrameConfigure(self, event):
        self.canvas.config(scrollregion=self.canvas.bbox("all"))

    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        self.canvas = Canvas(self, bg="blue")
        self.sensorsStatsFrame = Frame(self.canvas, bg = 'red')

        self.canvas.grid_rowconfigure(0, weight=1)

        myscrollbar = Scrollbar(self,orient=HORIZONTAL,command=self.canvas.xview)
        self.canvas.configure(xscrollcommand=myscrollbar.set)
        
        self.canvas.grid(row=0, sticky="nsew")
        myscrollbar.grid(row=1, sticky="nsew")
        
        for thing in range(100):
            Button(self.sensorsStatsFrame, text=f'Button {thing} Yo!').grid(row=thing//4, column=thing%5, sticky = 'nsew', pady=10, padx=10)

        self.canvas_frame = self.canvas.create_window((0,0),window=self.sensorsStatsFrame,anchor='nw')
        self.sensorsStatsFrame.bind("<Configure>", self.OnFrameConfigure)
        self.canvas.bind('<Configure>', self.FrameHeight)

if __name__ == "__main__":
    root = Tk()
    main = MainView(root)
    main.pack(fill="both", expand=1)
    root.wm_title("Example")
    root.mainloop()
1

Problemem jest niemożność użycia wymiarowania buttona w pikselach.
Z tego co wiem i poczytałem to można zastosować dwa rozwiązania.
a. dodanie niewidzialnego obrazka 1x1 do butona i wtedy wymiary w znakach zostaną zastąpione wymiarami w pikselach,
b. wstawienie każdego butona w ramkę wymiarowaną w pikselach, a buton na wypełnienie.

Następnie window event "<Configure>" odczyt rozmiaru okna, przeliczenie wymiaru i zależne od wymiaru przeliczenie kolumn/rzędów dla grida i ponowne wypełnienie grida.
Trochę nie rozumiem jednoczesne dopasowywanie butonów i ten skrol. Jak chcesz użyć skrola to dlaczego chcesz dopasowywać butony. Jak się nie mieści to skrolujesz, a jak się mieści to wszystko widać i nie trzeba skrolować. Tam maja być jakieś graniczne wymiary od których chcesz skrolować lub skalować?

Pozdrawiam
Radek Głębicki

1 użytkowników online, w tym zalogowanych: 0, gości: 1