Полосы прокрутки на холсте в tkinter не работают

#python #canvas #tkinter #scroll

#питон #холст #ткинтеръ #прокрутка #python #tkinter

Вопрос:

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

В принципе, я хочу создать таблицу в tkinter с 4 столбцами. Но я хочу иметь возможность прокручивать это, потому что строки будут позже взяты из базы данных mysql. но я не могу заставить свиток работать.

Вот мой код :

 from tkinter import *

root = Tk()
root.geometry("700x600")

frame_canvas = Frame(root)
frame_canvas.rowconfigure(0, weight=1)
frame_canvas.columnconfigure(0, weight=1)
frame_canvas.grid(row=0, column=0, sticky="news")

canvas = Canvas(frame_canvas)
canvas.grid(row=0, column=0, sticky="news")

vsb = Scrollbar(frame_canvas, orient="vertical", command=canvas.yview)
vsb.grid(row=0, column=1, sticky='ns')
canvas.configure(yscrollcommand=vsb.set)

for i in range(0, 50):
    for j in range(0, 4):
        canvas.columnconfigure(j, minsize=150)
        Label(canvas, text="hello" str(i) str(j)).grid(row=i, column=j)

canvas.config(scrollregion=canvas.bbox("all"))

app = root
root.mainloop()
  

Как мне заставить холст прокручиваться ? Есть ли другой способ создать таблицу ? Также позже, если я захочу добавить строку в нижнюю часть таблицы, как это возможно? или мне нужно очистить весь холст и заново отрисовывать его или что-то в этом роде?

РЕДАКТИРОВАТЬ Добавили окно рамки к холсту. Все равно прокрутка не будет работать. В этом может быть проблема сейчас ?

 from tkinter import *

root = Tk()
root.geometry("700x600")

frame_canvas = Frame(root)
frame_canvas.rowconfigure(0, weight=1)
frame_canvas.columnconfigure(0, weight=1)
frame_canvas.grid(row=0, column=0, sticky="news")

canvas = Canvas(frame_canvas, height=600, width=500)
canvas.grid(row=0, column=0, sticky="news")

vsb = Scrollbar(frame_canvas, command=canvas.yview, orient="vertical")
vsb.grid(row=0, column=1, sticky='ns')
canvas.configure(yscrollcommand=vsb.set)

frame2 = Frame(canvas, bg="powder blue", height=600, width=700)
canvas.create_window((0, 0), anchor="nw", height=600, width=600, window=frame2)

for i in range(0, 50):
    for j in range(0, 4):
        frame2.columnconfigure(j, minsize=120)
        Label(frame2, bg="powder blue", text="hello" str(i) str(j)).grid(row=i, column=j)

canvas.config(scrollregion=frame2.bbox("all"))

app = root
root.mainloop()
  

Комментарии:

1. Ваш Label должен перейти на второй Frame , canvas.create_window((0, 0), window=frame2, anchor='nw') и scrollregion=frame2.bbox() .

2. Извините, забыл указать: добавьте print(frame2.bbox()) перед .config(scrollregion= , это покажет виновника. .bbox() возвращает (0,0,0,0) используемый размер виджета, здесь frame неизвестный до отображения виджета. Добавьте root.update() для принудительного вычисления bbox.