2011-05-31 80 views
6

我一次又一次地遇到了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()有第一次),或做這種代碼需要完成重新思考/重寫?質量參差不齊

回答

1

我今天能解決我的問題。如果任何人有興趣在不斷變化的show()行爲,閱讀你如何能做到這一點:

我注意到這一段題爲多次調用顯示出對matplotlib網頁的what's new部分支持

長期以來的要求是支持多次調用show()。這很困難,因爲跨操作系統,用戶界面工具包和版本很難獲得一致的行爲。Eric Firing在整理後端合理化表演方面做了大量工作,希望展示所有新創建的數據並阻止執行,直到他們關閉爲止。重複呼叫顯示應該提出自上次呼叫以來新創建的數字。 Eric已經對他可以訪問的用戶界面工具包以及版本和平臺進行了大量測試,但是無法全部測試,因此請向郵件列表和錯誤跟蹤器報告問題。

這是在「什麼是新的」爲1.0.1版本,在突觸書面版本的時候還是回0.99.3。我能夠從源碼v1.0.1下載和構建。我還需要額外的軟件包來滿足依賴關係,其中包括libfreetype6-dev tk-dev tk8.5-dev tcl8.5-dev python-gtk2-dev

現在用matplotlib.__version__ == 1.0.1,下面的代碼塊我怎麼會想到:

import matplotlib.pyplot as p 
from scipy import eye 
p.imshow(eye(3)) 
p.show() 
print 'a' 
p.imshow(eye(6)) 
p.show() 
print 'b' 
p.imshow(eye(9)) 
p.show() 
print 'c' 
2

夫婦的想法:

如果你不喜歡S是一個全局變量,你可以做的onclick()的可調用的對象將其連接到這一點。

你的回調可以獲得/釋放一個鎖來控制程序流(很髒)。

你可以主動輪詢s來控制程序流(很髒)。

您可以手動控制你的人物通過fig.canvas.draw()繪圖

+0

感謝您的想法。我能夠通過從源代碼構建mpl來改變show()的阻塞行爲。 – wim 2011-06-01 03:01:34

0

我注意到運行的代碼

  1. 直接了Python解釋器中(命令行)之間的差異

  2. 把它放在Python腳本中並從命令行運行它(「python script.py」)

兩者都給出阻止行爲,這是可以的。

從解釋器出現這兩個圖像,從命令行只出現第一個。