2017-06-13 68 views
0

我正在尋找從python或ipython控制檯運行pyqt GUI的可能性。將Pyqt GUI主應用作爲單獨的非阻塞進程運行

基本上主要的想法是使用Pyqt GUI,就像使用matplotlib圖或圖像一樣,您可以從控制檯向GUI傳遞參數以查看數據,繼續在控制檯中執行操作,也許會打開另一個窗口,關閉第一個,在控制檯上做更多的事情等等。

我已經使用線程(Run pyQT GUI main app in seperate Thread)實現了這個解決方案,並且正如在評論中預測的那樣,它在幾個週期後崩潰了python控制檯。

這裏是導頻碼:

import sys 
from PyQt5 import QtWidgets, QtGui, QtCore 

class MainWindow(QtWidgets.QWidget): 
    def __init__(self): 
     # call super class constructor 
     super(MainWindow, self).__init__() 
     # build the objects one by one 
     layout = QtWidgets.QVBoxLayout(self) 
     self.pb_load = QtWidgets.QPushButton('Load') 
     self.pb_clear= QtWidgets.QPushButton('Clear') 
     self.edit = QtWidgets.QTextEdit() 
     layout.addWidget(self.edit) 
     layout.addWidget(self.pb_load) 
     layout.addWidget(self.pb_clear) 
     # connect the callbacks to the push-buttons 
     self.pb_load.clicked.connect(self.callback_pb_load) 
     self.pb_clear.clicked.connect(self.callback_pb_clear) 

    def callback_pb_load(self): 
     self.edit.append('hello world') 
    def callback_pb_clear(self): 
     self.edit.clear() 

def mythread(): 
    app = QtWidgets.QApplication(sys.argv) 
    win = MainWindow() 
    win.show() 
    app.exec_() 

def show(): 
    import threading 
    t = threading.Thread(target = mythread) 
    t.daemon = True 
    t.start() 

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    win = MainWindow() 
    win.show() 
    sys.exit(app.exec_()) 

運行該文件將正常運行的GUI。導入它並運行show()會嘗試以非阻塞的方式從控制檯運行GUI。

有沒有辦法產生一個線程或進程嵌入PyQt應用程序,將行爲像一個matplotlib窗口會?

回答

1

線程在這裏是無關緊要的。 PyQt已經被設計成在一個普通的python交互式會話中工作,所以不需要做任何特殊的事情來使它工作。

我建議你刪除mythreadshow功能,像這樣的東西代替它們:

if QtWidgets.QApplication.instance() is None: 
    app = QtWidgets.QApplication(sys.argv) 

然後你可以使用你的GUI模塊是這樣的:

>>> from mygui import MainWindow 
>>> win = MainWindow() 
>>> win.show() 
>>> win.callback_pb_load() 

永遠不要打電話app.exec_()。 PyQt會自行處理事件循環。

+0

請注意,如果您想在IPython中執行此操作,則必須在啓動IPython後使用'ipython --gui = qt5'或鍵入'%gui qt5'來啓動它。 – titusjan

+0

當然,我認爲我的主要問題一直在嘗試使用ipython來執行此操作,而不使用%gui qt5修飾符。遵循上面的配方工作正常。這已解決,謝謝。 – oliche