tkinter滚动区域未更新

2024-05-19 16:09:48 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的tkinter应用程序中,我试图让滚动条正常工作,前面的帖子是:Adding a scrollbar to a group of widgets in Tkinter。 如果我在for循环之前取消对代码的注释,那么一切都会正常工作,但就我(有限的)理解而言,如果我在for循环内部取消对代码的注释,那么它也会正常工作。 据我所知,调用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()

Tags: 代码in框架fortkinterconfigurerootall
1条回答
网友
1楼 · 发布于 2024-05-19 16:09:48

The first one just does it automatically every time a new label widget gets added into the frame with frame.bind("",onFrameConfigure) while the second does it manually, so what's the difference? Why doesn't it work?

区别在于,响应事件调用bbox发生在屏幕上实际绘制帧之后。在循环中调用它意味着在小部件可见且大小不确定之前调用它

如果您在循环内调用update_idletasks(或者update,取决于平台),强制在屏幕上绘制小部件,则在循环内调用bbox将起作用。尽管如此,在循环完成后立即调用它会更有效,这样在添加所有小部件后只调用一次

相关问题 更多 >