Jak ustawić pozycję scrolla na canvas w tkinter?

0

Cześć

Chciałbym ustawić pozycje scrolla w taki sposób, aby po załadowaniu elementów do ramki scroll był ustawiony na samym dole. Poniższy kod nie działa - co robię nie tak?

import tkinter

def get_frame_height(frame):
    return frame.winfo_reqheight()

root = tkinter.Tk()
root.geometry("450x600")

# CANVAS
canvas = tkinter.Canvas(root, bg="#cccccc")
canvas.pack(side="left", fill="both")

# ADD A SCROLLBAR TO THE CANVAS
scroll = tkinter.Scrollbar(root, orient="vertical", command=canvas.yview)
scroll.pack(side="right", fill="y")

# CREATE ANOTHER FRAME INSIDE THE CANVAS
frame = tkinter.Frame(canvas,  height=10)

# ADD THAT NEW FRAME TO A WINDOW IN THE CANVAS
canvas.create_window((0, 0), window=frame, anchor="nw")

for item in range(30):
    tkinter.Button(frame, text=f"Button {item} dzida!").grid(row=item, column=0, pady=10, padx=10)

# CONFIGURE THE CANVAS
canvas.configure(yscrollcommand=scroll.set, scrollregion=canvas.bbox('all'))
scroll.bind("<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all")))

# Scroll to the bottom
root.update_idletasks()
canvas.yview_moveto('1.0')

root.mainloop()
0

Aby ustawić pozycję scrolla na samym dole po załadowaniu elementów do ramki, należy wykonać kilka kroków:

Najpierw musisz zaktualizować obszar przewijania (scrollregion) do odpowiednich wymiarów po dodaniu elementów do ramki.
Następnie możesz przesunąć widok na dół.
Poniżej znajduje się poprawiony kod:

import tkinter

def get_frame_height(frame):
    return frame.winfo_reqheight()

root = tkinter.Tk()
root.geometry("450x600")

# CANVAS
canvas = tkinter.Canvas(root, bg="#cccccc")
canvas.pack(side="left", fill="both")

# ADD A SCROLLBAR TO THE CANVAS
scroll = tkinter.Scrollbar(root, orient="vertical", command=canvas.yview)
scroll.pack(side="right", fill="y")

# CREATE ANOTHER FRAME INSIDE THE CANVAS
frame = tkinter.Frame(canvas,  height=10)

# ADD THAT NEW FRAME TO A WINDOW IN THE CANVAS
canvas.create_window((0, 0), window=frame, anchor="nw")

for item in range(30):
    tkinter.Button(frame, text=f"Button {item} dzida!").grid(row=item, column=0, pady=10, padx=10)

# CONFIGURE THE CANVAS
canvas.configure(yscrollcommand=scroll.set, scrollregion=canvas.bbox('all'))

# Update the scrollregion to reflect the inner frame's actual size
canvas.update_idletasks()
canvas.config(scrollregion=canvas.bbox("all"))

# Scroll to the bottom
canvas.yview_moveto(1.0)

root.mainloop()

0

Bangla, dzięki!

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.