Tkinter中Scrollbar滚动条无法控制Canvas画布内控件的问题
Tkinter Canvas滚动条无法联动内部按钮问题解决
问题根因
你直接通过grid()方法将Button控件放在Canvas上,这种方式添加的控件属于Canvas的顶层独立子控件,不会被纳入Canvas的滚动管理体系,因此滚动时按钮不会跟着画布内容移动。
解决方案
使用Canvas提供的create_window()接口,将按钮注册为Canvas的内部画布元素,这类元素会自动响应滚动事件同步位移。
修正后完整代码
import tkinter from tkinter import Tk, Frame, Scrollbar, Canvas, BOTH, VERTICAL, HORIZONTAL ws = Tk() ws.title('PythonGuides') frame = Frame( ws, width=500, height=400 ) frame.pack(expand=True, fill=BOTH) canvas = Canvas( frame, bg='#4A7A8C', width=500, height=400, scrollregion=(0, 0, 700, 700) ) vertibar = Scrollbar( frame, orient=VERTICAL ) vertibar.pack(side=RIGHT, fill=Y) vertibar.config(command=canvas.yview) horibar = Scrollbar( frame, orient=HORIZONTAL ) horibar.pack(side=BOTTOM, fill=X) horibar.config(command=canvas.xview) canvas.config( xscrollcommand=horibar.set, yscrollcommand=vertibar.set ) # 改用create_window添加按钮 example = tkinter.Button(canvas, text="1") canvas.create_window(250, 150, window=example) # x、y参数可自定义按钮在画布中的位置 example2 = tkinter.Button(canvas, text="2") canvas.create_window(350, 300, window=example2) canvas.pack(expand=True, side=LEFT, fill=BOTH) ws.mainloop()
额外说明
create_window()的前两个参数是按钮在画布坐标系中的x/y坐标,你可以根据需求调整数值来对应你原来想要的布局位置- 如果你需要批量管理大量按钮,可以把所有按钮对象存在列表里,统一通过
create_window()添加,后续修改位置也可以调用canvas.coords()方法批量调整
内容的提问来源于stack exchange,提问作者c1410215
相关产品推荐
相关产品推荐

