Tkinter循环创建带滚动条多标签页:仅最后一个滚动条生效求解决
问题解决:循环创建带滚动条的Tkinter标签页仅最后一个生效
问题出在循环内的lambda绑定逻辑上。lambda表达式会延迟引用变量canvasParameters,当循环结束后,这个变量指向的是最后一次迭代创建的画布,所以所有标签页的<Configure>事件最终都会修改最后一个画布的滚动区域,导致只有最后一个标签页的滚动条正常工作。
修复方法
给lambda添加默认参数,把当前迭代的画布对象直接传入,避免延迟绑定的问题:
for i in range(ParameterTabNumber): z = ParameterTabs[i] FrameParametersMain = Frame(MainNotebook, background="#FFFFFF", width=200, height=150) FrameParametersMain.pack() MainNotebook.add(FrameParametersMain, text=str(z)) my_FrameParametersMain.append(FrameParametersMain) # 修正背景色笔误:#FFFFFFF → #FFFFFF canvasParameters = Canvas(FrameParametersMain, highlightthickness=0, bg='#FFFFFF') canvasParameters.pack(side=LEFT, fill=BOTH, expand=1) my_CanvasParameters.append(canvasParameters) scrollbarParameters = Scrollbar(FrameParametersMain, orient=VERTICAL, command=canvasParameters.yview) scrollbarParameters.pack(side=RIGHT, fill=Y) my_scrollbarParameters.append(scrollbarParameters) FrameParameters = Frame(canvasParameters) my_TopTabs.append(FrameParameters) canvasParametersWidgits = Canvas(FrameParameters, highlightthickness=0, bg='#FFFFFF', width=1700, height=1000) canvasParametersWidgits.pack() canvasParameters.create_window((0,0), window=FrameParameters, anchor="nw") canvasParameters.configure(yscrollcommand=scrollbarParameters.set) # 修改lambda,添加默认参数绑定当前画布 canvasParameters.bind('<Configure>', lambda e, canvas=canvasParameters: canvas.configure(scrollregion=canvas.bbox("all")))
额外说明
- 代码中
bg='#FFFFFFF'多了一个F,已修正为#FFFFFF,避免不必要的渲染问题。 - 通过给lambda设置默认参数
canvas=canvasParameters,每次迭代都会把当前的画布对象固定到lambda的参数中,确保每个标签页的事件处理都指向自己对应的画布。
内容的提问来源于stack exchange,提问作者pythonnewbie3
相关产品推荐
相关产品推荐

