将Pyqt GUI主应用程序作为单独的非阻塞进程运行

时间:2017-06-13 17:06:06

标签: python pyqt pyqt5

我正在寻找从python或ipython控制台运行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。

有没有办法产生一个线程或进程嵌入PyTt应用程序,就像matplotlib窗口一样?

1 个答案:

答案 0 :(得分:3)

线程与此无关。 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将负责事件循环本身。