tkinter scrollregion не обновляется - PullRequest
0 голосов
/ 09 марта 2020

Я пытался заставить работать полосу прокрутки, в моем приложении tkinter с этим предыдущим постом: Добавление полосы прокрутки к группе виджетов в Tkinter . Все работает нормально, если я раскомментирую код перед l oop, но, насколько я понимаю (ограниченно), я считаю, что он также должен работать, если я закомментирую код внутри l oop вместо этого. Насколько я понимаю, вызов canvas.configure(scrollregion=canvas.bbox("all")) должен обновить область прокрутки холста, чтобы включить все виджеты меток, которые размещены внутри фрейма. Первый просто делает это автоматически каждый раз, когда новый виджет надписи добавляется в кадр с frame.bind("<Configure>",onFrameConfigure), в то время как второй делает это вручную, так в чем же разница? Почему не работает?

import tkinter

root = tkinter.Tk()
canvas = tkinter.Canvas(root)
frame = tkinter.Frame(canvas)

scrollbar=tkinter.Scrollbar(root,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=scrollbar.set)

scrollbar.pack(side="right", fill="y")
canvas.pack(fill="both", expand=True)

canvas.create_window((0, 0), window=frame, anchor="nw")

# works 
#def onFrameConfigure(event):
#    canvas.configure(scrollregion=canvas.bbox("all"))
# 
#frame.bind("<Configure>", onFrameConfigure)

for x in range(100):

     new_label = tkinter.Label(frame, text="%d"%x)
     new_label.pack()

     # doesn't work
     #canvas.configure(scrollregion=canvas.bbox("all"))

root.mainloop()

1 Ответ

1 голос
/ 09 марта 2020

Первый просто делает это автоматически каждый раз, когда новый виджет надписи добавляется в фрейм с помощью frame.bind ("", onFrameConfigure), а второй делает это вручную, так в чем же разница? Почему это не работает?

Разница в том, что вызов bbox в ответ на событие происходит после , когда рамка фактически нарисована на экране. Вызов его внутри l oop означает, что он вызывается до , виджеты видны и их размер не определен.

Вызов bbox внутри l oop будет работать, если вы позвоните update_idletasks (или, возможно, update, в зависимости от платформы) внутри l oop, чтобы заставить виджеты отображаться на экране. Однако было бы гораздо эффективнее вызвать его сразу после завершения l oop, чтобы он вызывался один раз после добавления всех виджетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...