Tkinter程序中Scrollbar滑块消失问题求助
解决Canvas滚动条滑块消失的问题
你的问题出在Canvas的scrollregion没有随着内部Frame的内容更新,导致滚动条认为没有可滚动内容,滑块被隐藏。
问题原因
你当前绑定的是Canvas的<Configure>事件:
holder.bind('<Configure>', lambda e: holder.configure(scrollregion=holder.bbox("all")))
这个事件仅在Canvas自身大小改变时触发,但内部content Frame因添加多个Text组件被撑高时,并不会触发该事件,导致scrollregion始终是初始的小范围,滚动条无法显示滑块。
修复方案
将事件绑定到内部的content Frame上,当它的大小变化时更新Canvas的scrollregion:
修改代码中的绑定部分:
# 移除原Canvas绑定 # holder.bind('<Configure>', lambda e: holder.configure(scrollregion=holder.bbox("all"))) # 改为绑定content的<Configure>事件 content.bind('<Configure>', lambda e: holder.configure(scrollregion=holder.bbox("all")))
完整修正后的关键代码片段
root = Tk() # create top part top=Frame(root) # create a canvas to scroll holder = Canvas(top) # create scroll bar scroll = Scrollbar(top, orient=VERTICAL, command=holder.yview) # configure scrollbar for canvas holder.configure(yscrollcommand=scroll.set) # create frame for content inside canvas and add it to the canvas content = Frame(holder, relief=RAISED) holder.create_window(0, 0, window=content, anchor='nw') # 绑定content的Configure事件更新scrollregion content.bind('<Configure>', lambda e: holder.configure(scrollregion=holder.bbox("all"))) # create bottom part bottom = Frame(root, relief=SUNKEN) root.rowconfigure(0, weight=18) root.rowconfigure(1, weight=1, minsize=50) root.columnconfigure(0, weight=1) holder.pack(side=LEFT, fill=BOTH, expand=1) scroll.pack(side=RIGHT, fill=Y) content.pack(fill=X) top.grid(row=0, column=0, sticky='NSEW') bottom.grid(row=1, column=0, sticky='NSEW') num=0 for site in sites: temp=Text(content, height = 5) temp.configure(state= DISABLED) temp.pack(fill=X, side=TOP, padx= 5, pady= 5) siteBoxes.append(temp) num += 1 root.mainloop()
修改后,content Frame因内部Text组件添加而改变高度时,会触发<Configure>事件,及时更新Canvas的scrollregion,滚动条滑块即可正常显示。
内容的提问来源于stack exchange,提问作者SK99
相关产品推荐
相关产品推荐

