2016-09-12 9 views
0

スクリプトに次のシーケンスを実装し、できるだけシンプルにしておきたい(可能な場合は明示的マルチスレッドを避ける)。pyqtgraph:ユーザーがroiオブジェクトを配置するまで、ipythonスクリプトを一時停止する最も簡単な方法

  1. 一部のデータを処理します。結果は、2D numpyのアレイである、(import pyqtgraph as qt後pyqt5を使用して)pw = pg.show(a)を用いて表示aa

  2. を言う

  3. 例えば、円形のROIを定義

circ = pg.CircleROI([1024,1024],300) pw.addItem(circ)

経由で<オール開始= "4">ユーザーがスクリプトを続行、
  • は、ROIの座標を読み出し、関連する場所にROIを移動
  • ( ROI座標が使用されています)

  • 私の質問は次のとおりです:3と5の間のスクリプトでどのようにブレークを定義できますか?ユーザーがpyqtgraphがブロックされないように、4.を実行する時間があることを確認しますか?理想的には、ユーザーは、Enterキーを押すか、ボタンをクリックすることによって、適切な位置を確認します。

    編集:スクリプトはIPythonでqt guiで実行されます。

    Edit2:ここでは、IPythonで実行する完全なテストスクリプトを示します。私が欲しいのは、印刷出力が(slice(1024, 1174, None), slice(1024, 1174, None))

    import numpy as np 
    import pyqtgraph as pg 
    
    a = np.array(range(2048**2)).reshape((2048,2048)) 
    pw = pg.show(a) 
    circ = pg.CircleROI([1024,1024],300) 
    pw.addItem(circ) 
    
    
    
    roi = np.s_[int(circ.pos().x()):int(circ.pos().x()+circ.size().x()/2),\ 
          int(circ.pos().y()):int(circ.pos().y()+circ.size().x()/2)] 
    
    print(roi) 
    

    答えて

    2

    1. IPythonコンソールでraw_input(「」)

    よりも違うものであること、すなわち、ROIが評価される前に、ユーザが円を動かすことができるということですスクリプトはIPythonコンソールで実行されている場合は、スクリプトを一時停止するのpython3で

    raw_input("Press Enter to continue...") 
    

    またはinput()を追加してみてください。ユーザはipythonコンソールで戻る必要がありますが、コードは単純です。

    別の解決策keyPressEventにパッチを適用

    import numpy as np 
    import pyqtgraph as pg 
    
    a = np.array(range(2048**2)).reshape((2048,2048)) 
    pw = pg.show(a) 
    circ = pg.CircleROI([1024,1024],300) 
    pw.addItem(circ) 
    
    raw_input("Press Enter to continue...") 
    
    roi = np.s_[int(circ.pos().x()):int(circ.pos().x()+circ.size().x()/2),\ 
          int(circ.pos().y()):int(circ.pos().y()+circ.size().x()/2)] 
    
    print(roi) 
    

    2.モンキーはImageWindowでkeyPressEventにパッチを適用サルである可能性があります。

    は、このソリューションは、グローバルとにパッチを適用猿の両方を使用して、あなたはこれが何を意味するか知っていることを確認してくださいことに注意してください。

    import numpy as np 
    from PyQt4 import QtCore, QtGui 
    import pyqtgraph as pg 
    
    
    a = np.array(range(2048**2)).reshape((2048,2048)) 
    pw = pg.show(a) 
    circ = pg.CircleROI([1024,1024],300) 
    pw.addItem(circ) 
    
    def myKeyPressEvent(e): 
        if e.key() == QtCore.Qt.Key_Enter or e.key() == QtCore.Qt.Key_Return: 
         global selectionFinished 
         selectionFinished = True 
    
    # Monkey patch 
    selectionFinished = False 
    pw.keyPressEvent = myKeyPressEvent 
    
    while not selectionFinished: 
        QtGui.QApplication.processEvents() 
    
    roi = np.s_[int(circ.pos().x()):int(circ.pos().x()+circ.size().x()/2),\ 
          int(circ.pos().y()):int(circ.pos().y()+circ.size().x()/2)] 
    
    print(roi) 
    

    +0

    これも私の最初の考えでした。しかし、 'raw_input'コマンドでもGUIがフリーズします。 Figureを手動で開く(つまり、 'raw_input'の前にあるすべての行を実行すると)、' raw_input'行を実行した時点で、私は円を動かすことができません。もう数字。 – Felix

    +0

    これは私のipythonコンソールで正常に動作しました。スクリプトをテストに入れました。ipythonで 'import test'を実行しました – luddek

    +0

    本当に、それはスタンドアロンのipythonで動作しますが、私が最初にテストした私のスパイダーIDEでは動作しません。しかし、スタンドアロン版では、このコードを実行した後に私は図を閉じることができません。とにかく、2番目のソリューションは完全に動作します、それは私が必要としていたものです! – Felix

    関連する問題