2014-11-12 3 views
1

모든 pyqtgraph 위젯을 닫고 싶습니다. 내가 제안을 따라 here,하지만 그들은 작동하지 않았다. 내 코드는 다음과 같습니다pyqtgraph의 창 닫기 방법

def makeWindows(amp, title): 
    WYSIZE = 800 
    WXSIZE = 800 
    XSIZE = 200 
    YSIZE = 200 
    TSIZE = 100 
    STEPS = np.array([0.0, 0.25, 0.5,.75, 1.0]) 

    first = "00007F" 
    blue = "007FFF" 
    cyan = "7FFF7F" 
    yellow = "FF7F00" 
    red = "7F0000" 


    win = QtGui.QMainWindow() 
    win.resize(WXSIZE, WYSIZE) 
    CLRS = [first,blue, cyan, yellow, red] 

    for i,item in enumerate(CLRS): 
     CLRS[i] = list(ord(c) for c in item.decode('hex')) 
     CLRS[i].append(255) 

    clrmp = pg.ColorMap(STEPS, np.array(CLRS)) 


    lut = clrmp.getLookupTable() 

    plt = pg.PlotItem(labels={'bottom': ('samples', 'm'), 'left': ('stuff', 'm')}, title = title) 
    plt.setAspectLocked(False) 
    imv = pg.ImageView(view = plt) 
    win.setCentralWidget(imv) 
    #imv.setLevels(3,6) 
    imv.ui.histogram.gradient.setColorMap(clrmp) 
    imv.setImage(amp) 
    win.show() 

    return win, imv 


def main(): 
    app = QtGui.QApplication([]) 


    win1, imv1 = makeWindows(amp, "amp") 

    if __name__ == '__main__': 
     if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):    
      status = QtGui.QApplication.instance().exec_() 

      #sys.exit(status) 
      imv1.close() 
      win1.close() 
      app.closeAllWindows() 

main() 

이 창을 실행 한 후에는 모든 창을 닫아야하지만 그렇지 않습니다. 나는 이미지를 닫지도 않는다.

내 원래 의도는 그들이 (CTRL-C) 키보드 인터럽트를 삽입 할 때 사용자가 모든 창을 닫을 수 있도록하는 방법을 만드는 것이었다

I : 당신의 도움이

UPDATE에 대한

감사합니다 makeWindows

,617,451의 끝으로 다음 라인을 다음 함수

def close_all(): 
    app = QtGui.QApplication([]) 
    app.closeAllWindows() 

을 첨가하고, 추가

sh = QtGui.QShortcut(QtGui.QKeySequence("Ctrl+C"),imv,None, close_all) 
sh.setContext(QtCore.Qt.ApplicationShortcut) 

이 창에 포커스가있을 때 사용자가 Ctrl 키 +의 C를 누르면 그 언제 있도록한다, 그것은 모든 창을 닫습니다

답변

2

QApplication.exec_()에 대한 귀하의 호출은 반환하지 않습니다 - 그것은 블록, 어플리케이션이 될 때까지 종료되었습니다 (이 경우 창을 닫을 때 응용 프로그램이 종료 됨). 따라서 창을 닫을 줄은 이미 닫은 후에야 호출됩니다.

+0

QApplication.exec을 방해 할 수있는 방법이 있습니까? 끝낼 준비가되었을 때 QApplication.quit()을 보낼 수있는 백그라운드 스레드를 미리 시작해야합니까? –

+0

Qt는 이벤트 기반 프레임 워크입니다. 응용 프로그램이 실행되는 동안 콜백을 트리거하려면 사용자 입력 또는 타이머가 필요합니다. 아마도 당신은 당신이 성취하려는 것을 더 설명해야합니다. – Luke

+0

키보드 인터럽트를 사용하여 모든 그래프를 종료하고 싶습니다. 거기에 몇 가지 설명서 또는 참조 내가 그것을 종료하는 방법을 보여줄 것이라고 볼 수 있습니까? –