Matplotlib:使用Button组件无法更新Axes文本内容的问题求助
我写了一段代码,想实现点击按钮后在Axes组件里显示按钮被点击的次数,同时控制台也会打印这个次数。现在控制台的打印是正常的,但Axes里的文本就是不更新。代码如下:
from matplotlib import pyplot as plt from matplotlib.widgets import Button fig, ax = plt.subplots(figsize=(7,7)) ax.set_visible(False) class MyClass: def __init__(self, fig): self.N_presses = 0 def button_fx(self, event): ax_str.clear() self.N_presses += 1 text_out = "Pushed {} times".format(self.N_presses) ax_str.text(0.5, 0.5, text_out) print(text_out) MC = MyClass(fig) ax_str = fig.add_axes((0.25, 0.5, 0.5, 0.1)) ax_button = fig.add_axes((0.25, 0.3, 0.5, 0.1)) my_button = Button(ax_button, "Push this button", color="0.75", hovercolor="0.875") my_button.on_clicked(func=MC.button_fx) plt.show()
我试过甚至直接绘图也不行,想问问到底为什么
button_fx里没法更新ax_str的内容?有没有解决办法?另外备注一下:这个类结构在我的实际项目里是必须保留的,所以解决方案得兼容这个类结构。
嗨,我帮你排查了下问题,核心原因和解决思路如下:
问题根源:没有触发画布重绘
Matplotlib的界面不会自动感知你对Axes内容的修改,所以每次更新文本后,你需要主动通知它重新绘制画布。另外你当前代码依赖全局变量ax_str,虽然能运行,但不符合类的封装原则,也容易埋下隐患。
修正后的代码(保留类结构)
from matplotlib import pyplot as plt from matplotlib.widgets import Button fig, ax = plt.subplots(figsize=(7,7)) ax.set_visible(False) class MyClass: # 初始化时传入画布和文本显示用的Axes,避免依赖全局变量 def __init__(self, fig, text_ax): self.N_presses = 0 self.fig = fig self.text_ax = text_ax def button_fx(self, event): self.text_ax.clear() self.N_presses += 1 text_out = "Pushed {} times".format(self.N_presses) # 添加ha='center'让文本在Axes中水平居中 self.text_ax.text(0.5, 0.5, text_out, ha='center') print(text_out) # 触发画布重绘,更新界面显示 self.fig.canvas.draw_idle() # 先创建文本显示用的Axes ax_str = fig.add_axes((0.25, 0.5, 0.5, 0.1)) # 将画布和Axes传入类实例 MC = MyClass(fig, ax_str) ax_button = fig.add_axes((0.25, 0.3, 0.5, 0.1)) my_button = Button(ax_button, "Push this button", color="0.75", hovercolor="0.875") my_button.on_clicked(func=MC.button_fx) plt.show()
关键改动说明:
- 触发画布更新:在
button_fx末尾调用self.fig.canvas.draw_idle(),这个方法会在系统空闲时高效重绘画布,让界面同步显示最新内容。 - 封装核心对象:把
fig和text_ax(原ax_str)作为类的属性,不再依赖全局变量,代码结构更清晰,也避免了全局变量可能引发的意外问题。 - 优化文本显示:给
text()方法添加ha='center'参数,让文本在Axes中真正水平居中,提升显示效果。
这样修改后,点击按钮就能看到Axes里的文本实时更新了,同时完全保留了你需要的类结构~
备注:内容来源于stack exchange,提问作者BGreen
相关产品推荐
相关产品推荐

