You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:25:07