Полоса прокрутки Tkinter Не работает для объектов внутри холста

#python #tkinter

Вопрос:

Я сделал холст с двумя полосами прокрутки и двумя кнопками. Но полоса прокрутки не взаимодействует с кнопками внутри холста. Что я хочу сделать, так это то, что всякий раз, когда я прокручиваю (например, прокручиваю вниз), все кнопки на холсте перемещаются в противоположном направлении (в данном случае вверх), но в настоящее время они вообще не будут перемещаться.

 ws = Tk()
ws.title('PythonGuides')

frame = Frame(
    ws,
    width=500,
    height=400
)
frame.pack(expand=True, fill=BOTH)

canvas = Canvas(
    frame,
    bg='#4A7A8C',
    width=500,
    height=400,
    scrollregion=(0, 0, 700, 700)
)

vertibar = Scrollbar(
    frame,
    orient=VERTICAL
)
vertibar.pack(side=RIGHT, fill=Y)
vertibar.config(command=canvas.yview)

horibar = Scrollbar(
    frame,
    orient=HORIZONTAL
)
horibar.pack(side=BOTTOM, fill=X)
horibar.config(command=canvas.xview)

canvas.config(width=500, height=400)

canvas.config(
    xscrollcommand=horibar.set,
    yscrollcommand=vertibar.set
)

example=tkinter.Button(canvas, text="1")
example.grid(row=3, column=5)

example2 = tkinter.Button(canvas, text="2")
example2.grid(row=6, column=7)

canvas.pack(expand=True, side=LEFT, fill=BOTH)

ws.mainloop()
 

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

1. Вам нужно использовать canvas.create_window(...) вместо .grid(...) того, чтобы вставлять кнопки в холст.

2. итак, как я должен изменить свой код? Я попытался поискать в Google «python canvas.create_window» и не нашел много полезной информации.

Ответ №1:

Вы не можете прокручивать элементы холста, если они помещены в холст с помощью .grid()/.pack()/.place() .

Используйте .create_window() вместо этого:

 ...
example = tkinter.Button(canvas, text="1")
canvas.create_window(10, 10, window=example, anchor="nw")

example2 = tkinter.Button(canvas, text="2")
canvas.create_window(50, 50, window=example2, anchor="nw")
...