Изменение размера полосы прокрутки в tkinter (используя сетку) - PullRequest
1 голос
/ 31 мая 2019

Я создаю графический интерфейс Tkinter, который позволяет запрашивать базу данных и отображать результаты в прокручиваемом фрейме. Однако при получении результатов полоса прокрутки не будет регулироваться в соответствии с новым размером кадра. Как я могу получить полосу прокрутки, чтобы иметь возможность отображать все результаты? Я собрал быструю и грязную версию кода, чтобы продемонстрировать мою проблему.

import tkinter as tk

def Lookup():
    list = frame_buttons.grid_slaves()
    for l in list:
        l.destroy()
    for x in range(1000):
        tk.Label(frame_buttons, text="test", background="white").grid(row=x)


root = tk.Tk()
root.grid_rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)

frame_main = tk.Frame(root, bg="white")
frame_main.grid(row = 0,sticky='news')
frame_input = tk.Frame(frame_main, background = "white")
frame_input.grid(row=0, column=0, pady=(5, 0), sticky='nw')

tk.Button(frame_input, text="Search", fg="black", background = "grey",command=Lookup).grid(row=3, column=0,sticky='nw')

# Create a frame for the canvas with non-zero row&column weights
frame_canvas = tk.Frame(frame_main)
frame_canvas.grid(row=1, column=0, pady=(5, 0), sticky='nw')
frame_canvas.grid_rowconfigure(0, weight=1)
frame_canvas.grid_columnconfigure(0, weight=1)
# Set grid_propagate to False to allow 5-by-5 buttons resizing later
frame_canvas.grid_propagate(False)

# Add a canvas in that frame
canvas = tk.Canvas(frame_canvas, bg="gray")
canvas.grid(row=0, column=0, sticky="news")

# Link a scrollbar to the canvas
vsb = tk.Scrollbar(frame_canvas, orient="vertical", command=canvas.yview)
vsb.grid(row=0, column=1, sticky='ns')
canvas.configure(yscrollcommand=vsb.set)
frame_buttons = tk.Frame(canvas, bg="gray")
canvas.create_window((0, 0), window=frame_buttons, anchor='nw')
for x in range(15):
    tk.Label(frame_buttons, text="blah", background = "white").grid(row=x)
frame_buttons.update_idletasks()
frame_canvas.config(width=500, height=100)
canvas.config(scrollregion=canvas.bbox("all"))
root.mainloop()

это изначально помещает 20 меток в область прокрутки, что достаточно для активации полосы прокрутки. Затем, когда вы нажимаете кнопку поиска, он заменяет эти 20 ярлыков на 1000 тестовых меток. Но только первые 20 будут доступны для просмотра.

1 Ответ

0 голосов
/ 31 мая 2019

Вам необходимо сбросить область прокрутки всякий раз, когда кадр меняет размер и элементы перерисовываются.

Обычный способ сделать это - привязать событие <Configure> кадра, чтобы оно происходило автоматически какрамка увеличивается и сжимается.

Пример:

def reset_scrollregion(event):
    canvas.config(scrollregion=canvas.bbox("all"))
...
frame_buttons.bind("<Configure>", reset_scrollregion)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...