在我的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()
区别在于,响应事件调用
bbox
发生在屏幕上实际绘制帧之后。在循环中调用它意味着在小部件可见且大小不确定之前调用它如果您在循环内调用
update_idletasks
(或者update
,取决于平台),强制在屏幕上绘制小部件,则在循环内调用bbox
将起作用。尽管如此,在循环完成后立即调用它会更有效,这样在添加所有小部件后只调用一次相关问题 更多 >
编程相关推荐