【发布时间】:2014-03-08 10:42:30
【问题描述】:
希望有人能告诉我在我的第一个程序中我做错了什么 回调。
目标:
- 显示包含数据的图
- 允许用户点击绘图 4 次。每次,X坐标 被附加到保存的列表中。
- 当鼠标移动时,它的水平位置由垂直
在情节中来回移动的线。 (我保存二维线
对象为
self.currentLine) - 当用户通过单击选择一个点时,垂直线会下降到 x-感兴趣的坐标,并生成一个新的继续跟踪 鼠标位置。
在用户输入的末尾,应该有四行垂直线和类 应该返回一个包含它们的 x 坐标的列表。
目前,我无法弄清楚更新线对象的正确方法 情节(即我可以得到我想要的鼠标跟踪效果)。我也拿不到 完成后返回值列表的类。
我知道while 循环可能不是正确的方法,但我无法找出正确的方法。
import matplotlib.pyplot as plt
import pdb
class getBval:
def __init__(self):
figWH = (8,5) # in
self.fig = plt.figure(figsize=figWH)
plt.plot(range(10),range(10),'k--')
self.ax = self.fig.get_axes()[0]
self.x = [] # will contain 4 "x" values
self.lines = [] # will contain 2D line objects for each of 4 lines
self.connect = self.ax.figure.canvas.mpl_connect
self.disconnect = self.ax.figure.canvas.mpl_disconnect
self.mouseMoveCid = self.connect("motion_notify_event",self.updateCurrentLine)
self.clickCid = self.connect("button_press_event",self.onClick)
def updateCurrentLine(self,event):
xx = [event.xdata]*2
self.currentLine, = self.ax.plot(xx,self.ax.get_ylim(),'k')
plt.show()
def onClick(self, event):
if event.inaxes:
self.updateCurrentLine(event)
self.x.append(event.xdata)
self.lines.append(self.currentLine)
del self.currentLine
if len(self.x)==4:
self.cleanup()
def cleanup(self):
self.disconnect(self.mouseMoveCid)
self.disconnect(self.clickCid)
return self
xvals = getBval()
print xvals.x
【问题讨论】:
-
由于回调的工作方式,您无法预先说“返回”,但您可以询问对象是否 a) 它已完成并且 b) 它的值是什么。事件驱动编程可能需要一些时间来理解。
-
谢谢。如果
return语句不合适,那么等待对象完成的可接受协议是什么?只是一个while循环重复检查变量的值直到它满足标准(例如我的问题中的 4 个项目的列表)?这似乎效率低下,但我不知道用谷歌搜索什么来找到正确的答案。再次感谢。 -
signals可以很方便或者只是 while + sleep(假设你有线程)。有了你正在做的事情,你可能想放弃一个简单的脚本并接受你正在使用的 gui 框架工作(嵌入 mpl),这会给你更多的回调,你可以在选择足够的点时触发。 -
假设你有线程 Sleep + while 阻止窗口出现(也许这应该告诉我我没有线程)。你的意思是我需要导入和使用
threading模块吗?另外,嵌入 mpl 是指like this? (tkinter)(部分解决了我现在遇到的问题)
标签: python class matplotlib callback