我正在尝试绘制用户点击的多边形并将其渲染到matplotlib画布上:
def helperClick(self, clickEvent):
self.lastXClick = clickEvent.x
self.lastYClick = clickEvent.y
self.lastButtonClick = clickEvent.button
def measurePoly(self):
self.lastButtonClick = None
cid = self.ui.canvas2.mpl_connect('button_press_event', self.helperClick)
#Exit render loop on right click
while self.lastButtonClick != 3:
print('waiting')
if self.lastButtonClick == 1:
#Eventually render polygon on click of 1
print('clicked')
self.ui.canvas2.mpl_disconnect(cid)
#do more stuff with polygon data
我只是想"等待"对于用户点击,在用户点击时执行某些操作,然后通过左键单击继续执行该功能。然而,我的无限循环冻结了python和崩溃。我知道这是一个不好的方法(显然它不起作用:P)但我不确定如何正确地做到这一点。
谢谢,
tylerthemiler
答案 0 :(得分:2)
听起来你正试图在自己的代码中手动运行“mainloop”?
使用回调函数的关键在于你让gui工具包运行自己的mainloop(在这种情况下,当你调用show
时输入它。)
这是一个非常简单的例子,说明了你要做的事情。
在左键单击(最初为空白)绘图时添加顶点,然后在右键单击时绘制相应的多边形。在右键单击之前不会绘制任何内容(在通过左键单击添加点时绘制多边形并不太难,但在matplotlib中有效地执行它有点冗长)。
import matplotlib.pyplot as plt
class Plot(object):
def __init__(self):
self.poly = []
self.fig, self.ax = plt.subplots()
self.ax.axis([0, 10, 0, 10])
self.fig.canvas.mpl_connect('button_press_event', self.on_click)
plt.show()
def on_click(self, event):
if event.button == 1:
self.poly.append((event.xdata, event.ydata))
elif event.button == 3:
self.draw_poly()
def draw_poly(self):
self.ax.fill(*zip(*self.poly))
self.poly = []
self.fig.canvas.draw()
Plot()