Scrollable Frame i zmiana rozmiaru okna

Scrollable Frame i zmiana rozmiaru okna
TT
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 97
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?

Kopiuj
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()
Radosław Głębicki
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Sardine, Italy
  • Postów: 187
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.