我一次又一次地遇到了show()
這個麻煩,我敢肯定我做錯了什麼,但不知道「正確」做我想做的事。(python)matplotlib pyplot show()..阻止與否?
而且[我覺得]我想是某種方式在主線程阻塞,直到事件在GUI線程發生,像這樣的作品第一次:
from matplotlib import pyplot as p
from scipy import rand
im = (255*rand(480,640)).astype('uint8')
fig = p.figure()
ax = fig.add_subplot(111)
ax.imshow(im)
# just any mutable container for storing a click
s = [-1, -1]
def onclick(event):
if event.xdata is not None and event.ydata is not None:
s[0] = event.xdata
s[1] = event.ydata
p.close()
cid = fig.canvas.mpl_connect('button_press_event', onclick)
p.show()
print s
的p.show()
塊,直到p.close()
在事件處理程序中調用。但是當第二次運行相同的代碼時,它會通過p.show()
比賽並打印出原始文件s, [-1, -1]
。
我已閱讀關於p.show()
是否可以或應該多次從同一程序中調用的衝突信息。它似乎被設計爲只用一次,並且只在腳本的末尾使用一次。其他用例似乎以某種方式打破了pyplot
(狀態機?)。
我試着使用的p.draw()
和p.ion()
和p.ioff()
組合,但無法得到我想要的行爲(無論事情不會阻止正常或情節並沒有在正確的時間出現)。
我也對事件處理程序在這裏能看到s
的方式感到困惑,以及這是否是一種很差的傳入/傳出信息的方式。如果我不使用像數組或列表這樣的可變容器,我想由事件處理程序設置的信息就會作爲局部變量丟失。有沒有其他的方法我錯過了,GUI線程可以將信號傳遞迴主線程?有沒有一種方法可以在繼續之前在事件處理函數中阻止主要信號,無需定期輪詢或繁忙等待?
所以我想最終我的主要問題是:
有一個整潔的替代p.show()
,是我想要做什麼(相同的行爲爲p.show()
有第一次),或做這種代碼需要完成重新思考/重寫?質量參差不齊
感謝您的想法。我能夠通過從源代碼構建mpl來改變show()的阻塞行爲。 – wim 2011-06-01 03:01:34