gpt4 book ai didi

Python:Matplotlib 按钮不工作

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:57 24 4
gpt4 key购买 nike

我的这段代码包含一个名为 bbutton 的按钮,按下该按钮会执行 movetext 功能:

from pylab import *
from matplotlib.widgets import RectangleSelector
from matplotlib.widgets import Button
import numpy as np
import matplotlib.pylab as plt


fig = plt.figure()
ax = fig.add_subplot(111)

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = (Z1 - Z2) * 10

plt.contourf(X, Y, Z)

text1=plt.text(0, 0, 'ghghg',color='black',fontsize=14)
plt.text(1, 1, 'Calculation ',color='black',fontsize=14)
plt.title('Average ')

plt.xlabel('Longtitude ', fontsize=14, color='black')
plt.ylabel('Latitude ', fontsize=14, color='black')
plt.grid(True)

def onselect(eclick, erelease):
'eclick and erelease are matplotlib events at press and release'
text1.set_text('Geo ')
text1.set_x(eclick.xdata)
text1.set_y(eclick.ydata)
plt.draw()

def toggle_selector(event):
print ' Key pressed.'
if event.key in ['Q', 'q'] and toggle_selector.RS.active:
print ' RectangleSelector deactivated.'
toggle_selector.RS.set_active(False)
if event.key in ['A', 'a'] and not toggle_selector.RS.active:
print ' RectangleSelector activated.'
toggle_selector.RS.set_active(True)

def movetext(self):
print 'clearing plot'
text1.set_x(np.random.random(1))
text1.set_y(np.random.random(1))
plt.draw()


toggle_selector.RS = RectangleSelector(ax, onselect, drawtype='line')
plt.connect('key_press_event', toggle_selector)

buttonaxe = plt.axes([0.7, 0.05, 0.1, 0.1])
bbutton = Button(buttonaxe, 'movetext',color='0.85', hovercolor='0.95')
bbutton.on_clicked(movetext)

plt.show()

放在底部的按钮工作正常。但是在下面的示例中,如果我只是将所有代码放在一个名为 Plotter 的函数中,该按钮会显示在绘图中,但它不起作用。当鼠标悬停在按钮上方时没有变化,并且连接的函数 movetext 没有执行。

from pylab import *
from matplotlib.widgets import RectangleSelector
from matplotlib.widgets import Button
import numpy as np
import matplotlib.pylab as plt

fig = plt.figure()
ax = fig.add_subplot(111)


def Plotter():

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = (Z1 - Z2) * 10
#Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
plt.contourf(X, Y, Z)
text1=plt.text(0, 0, 'ghghg',color='black',fontsize=14)
plt.text(1, 1, 'Calculation ',color='black',fontsize=14)
plt.title('Average ')

plt.xlabel('Longtitude ', fontsize=14, color='black')
plt.ylabel('Latitude ', fontsize=14, color='black')
plt.grid(True)

def onselect(eclick, erelease):
'eclick and erelease are matplotlib events at press and release'
text1.set_text('Geo ')
text1.set_x(eclick.xdata)
text1.set_y(eclick.ydata)
plt.draw()

def toggle_selector(event):
print ' Key pressed.'
if event.key in ['Q', 'q'] and toggle_selector.RS.active:
print ' RectangleSelector deactivated.'
toggle_selector.RS.set_active(False)
if event.key in ['A', 'a'] and not toggle_selector.RS.active:
print ' RectangleSelector activated.'
toggle_selector.RS.set_active(True)

def movetext(self):
print 'clearing plot'
text1.set_x(np.random.random(1))
text1.set_y(np.random.random(1))
plt.draw()


toggle_selector.RS = RectangleSelector(ax, onselect, drawtype='line')
plt.connect('key_press_event', toggle_selector)

buttonaxe = plt.axes([0.7, 0.05, 0.1, 0.1])
bbutton = Button(buttonaxe, 'movetext',color='0.85', hovercolor='0.95')
bbutton.on_clicked(movetext)
Plotter()
plt.show()

有人可以解释这种行为吗?我究竟做错了什么?

最佳答案

这是因为bbutton是本地名称,当Plotter()调用结束后,名称bbutton就没有了,什么都没有对 Button 对象的引用,它将被垃圾收集器回收。

要解决这个问题,您可以创建一个对它的虚拟引用,例如将以下行添加到 Plotter 的末尾:

buttonaxe._button = bbutton

关于Python:Matplotlib 按钮不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13165332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com