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
相关产品推荐
相关产品推荐

