在Tkinter窗口中无法完整显示4-5个Matplotlib柱状图求助
在Tkinter中实现带水平滚动的多Matplotlib柱状图
问题根源
直接将Matplotlib画布放在普通Frame中,当内容超出窗口宽度时,Frame无法提供滚动能力,必须借助Tkinter原生的Canvas组件配合滚动条实现滚动容器。
解决方案代码
import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure # 示例数据 x = [1, 2, 3, 4] y = [1, 2, 3, 4] root = tk.Tk() root.geometry("1000x1000") root.title("eggs") # 构建滚动容器结构 # 外层Canvas用于实现滚动功能 scroll_canvas = tk.Canvas(root) scroll_canvas.pack(side="top", fill="both", expand=True) # 添加水平滚动条 scrollbar = tk.Scrollbar(root, orient="horizontal", command=scroll_canvas.xview) scrollbar.pack(side="bottom", fill="x") # 绑定滚动条与Canvas的滚动逻辑 scroll_canvas.configure(xscrollcommand=scrollbar.set) # 内部框架,用来承载所有Matplotlib图表 inner_frame = tk.Frame(scroll_canvas) # 将内部框架嵌入Canvas的可视区域 scroll_canvas.create_window((0, 0), window=inner_frame, anchor="nw") # 封装图表创建函数,减少重复代码 def create_bar_plot(frame, x_data, y_data): fig = Figure(dpi=100) ax = fig.add_subplot(111) ax.bar(x_data, y_data) # 生成柱状图 canvas = FigureCanvasTkAgg(fig, master=frame) canvas.draw() canvas.get_tk_widget().pack(side="left", fill="both", expand=True) return canvas # 创建4个柱状图(可扩展到更多) create_bar_plot(inner_frame, x, y) create_bar_plot(inner_frame, x, [2,4,6,8]) create_bar_plot(inner_frame, x, [5,3,7,2]) create_bar_plot(inner_frame, x, [4,1,3,5]) # 监听内部框架尺寸变化,动态更新Canvas的滚动范围 def update_scroll_area(event): scroll_canvas.configure(scrollregion=scroll_canvas.bbox("all")) inner_frame.bind("<Configure>", update_scroll_area) root.mainloop()
核心改进点
- 用Tkinter原生
Canvas作为滚动载体,内部嵌套Frame统一放置所有图表画布 - 绑定水平滚动条与Canvas的滚动命令,实现滚动同步
- 通过
<Configure>事件监听内部框架尺寸变化,自动更新滚动区域,确保所有内容可被滚动查看 - 封装图表创建函数,简化代码结构,便于扩展更多图表
- 替换原折线图为柱状图,匹配需求中的展示要求
内容的提问来源于stack exchange,提问作者Chandrakanth Reddy
相关产品推荐
相关产品推荐

