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

Tkinter中调整Figure大小后旧图像残留问题求助

解决Tkinter中Matplotlib Figure缩小后旧图像残留的问题

在Tkinter应用中用Matplotlib的FigureCanvasTkAgg展示图像时,调整Figure高度并缩小后,原较大图像的残留会显示在下方。调用fig.clear()只会清空新绘制的内容,旧图像残留依然存在。

原因分析

问题核心在于Matplotlib Figure尺寸更新后,对应的Tkinter Widget大小没有同步调整。虽然Figure的尺寸已改小,但承载它的Tk Canvas组件还保持着原来的大尺寸,之前渲染的图像内容就会残留在未更新的区域里。

解决方案

更新Figure尺寸后,需要同步修改canvas.get_tk_widget()的宽高属性,让Tkinter组件的大小和新的Figure尺寸匹配,之后再重新绘制图像并触发界面布局更新。

修改后的完整代码

from tkinter import Label, Tk, IntVar, Entry
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

def plot_data():
    ax.clear()
    ax.plot([20,22,24,26,28],[5,10,8,3,6])
    canvas.draw_idle()
    
def update_figure_size():
    new_height = figure_height.get()
    # 更新Matplotlib Figure的尺寸
    fig.set_size_inches(700*px, new_height*px)
    # 同步更新Tkinter组件的像素尺寸
    canvas.get_tk_widget().configure(width=700, height=new_height)
    # 重新绘制数据
    plot_data()
    # 强制更新界面布局,确保尺寸变化立即生效
    root.update_idletasks()
    
# MAIN CODE
root = Tk()

px = 1/plt.rcParams['figure.dpi'] # 默认dpi=100,px=0.01
figure_height = IntVar(value=600)
figure_height_entry = Entry(master=root,textvariable=figure_height)
        
fig = plt.Figure(figsize=(700*px, figure_height.get()*px))
ax = fig.add_subplot(111)
canvas = FigureCanvasTkAgg(fig, master = root)
canvas.get_tk_widget().grid(column=0, row=0)

label = Label(root, text="Figure height:")
label.grid(column=1,row=0)

figure_height_entry.bind('<Return>', lambda e: update_figure_size())
figure_height_entry.grid(column=2,row=0)  

plot_data()

root.mainloop()

关键改动说明

  • canvas.get_tk_widget().configure(width=700, height=new_height):直接修改Tk组件的像素尺寸,和Figure的实际像素尺寸完全匹配(700px*100dpi=700像素,new_height参数本身就是像素值)。
  • root.update_idletasks():强制Tkinter立即更新界面布局,避免组件尺寸变化延迟导致的残留问题。

内容的提问来源于stack exchange,提问作者AlMa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:42:41