Как закрыть окна в pyqtgraph

Я хочу закрыть все свои виджеты 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).

Я добавил следующую функцию

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

и добавил следующие строки ближе к концу makeWindows

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

Это делает так, что каждый раз, когда пользователь нажимает Ctrl+c, когда окно находится в фокусе, он закрывает все окна.


person Legen Diary    schedule 12.11.2014    source источник


Ответы (1)


Ваш вызов QApplication.exec_() не возвращается — он блокируется до тех пор, пока приложение не завершит работу (в этом случае приложение завершается, когда вы закрываете окно). Таким образом, строки, которые закроют окно, не вызываются до тех пор, пока вы его не закроете.

person Luke    schedule 14.11.2014
comment
есть ли способ прервать QApplication.exec? Нужно ли мне заранее запускать фоновый поток, который может отправить QApplication.quit(), когда я буду готов к его завершению? - person Legen Diary; 14.11.2014
comment
Qt — это фреймворк, основанный на событиях. Вам нужен либо пользовательский ввод, либо таймер для запуска обратных вызовов во время работы приложения. Возможно, вам следует подробнее объяснить, чего вы пытаетесь достичь. - person Luke; 15.11.2014
comment
Я хотел бы, чтобы прерывание клавиатуры отключало все графики. есть ли какая-то документация или ссылка, на которую я могу взглянуть, чтобы показать, как ее закрыть? - person Legen Diary; 15.11.2014
comment
Если в фокусе окна графа, то они будут отвечать за перехват ключей и можно просто создать глобальный ярлык: sh = QtGui.QShortcut(QtGui.QKeySequence("Ctrl+C"), window); sh.setContext(QtCore.Qt.ApplicationShortcut). Если консоль находится в фокусе, то может быть очень сложно поймать прерывание клавиатуры. - person Luke; 15.11.2014