使用线程在异常上创建新的qwidget

时间:2015-09-18 19:44:27

标签: python multithreading exception pyqt

from PyQt4 import QtGui
import threading
import sys

class Window(QtGui.QWidget):
    def __init__(self):
        super().__init__()
        self.button = QtGui.QPushButton('click', self)
        self.button.clicked.connect(self.mythread)

    def mythread(self):
        self.t=threading.Thread(target=self.action)
        self.t.start()

    def action(self):
        try:
            raise FileExistsError

        except FileExistsError:
            self.errorwindow = QtGui.QWidget()
            self.errorwindow.setGeometry(200, 200, 200, 100)
            self.errortext = QtGui.QLabel('error', self.errorwindow)
            self.errorwindow.show()
            print('1')

def main():
    program = QtGui.QApplication(sys.argv)
    a=Window()
    a.setGeometry(300, 300, 200, 100)
    a.show()
    sys.exit(program.exec_())

if __name__=='__main__':
    main()

在这里可以很容易地看到,我正在尝试制作一个" oops!发生错误"一种由线程在异常上创建的窗口。这是一个示例代码,显示了我是如何尝试这样做的,当你运行它时,你会看到一个窗口显示一小段时间然后消失。使用我的实际程序,它甚至会导致崩溃。那print('1')就是要看口译员是否达到那条线,是的,它会打印出来' 1'。所以它并不是说它根本不运行异常块,但它确实没有创建一个qwidget。我做错了什么?

1 个答案:

答案 0 :(得分:1)

除了创建的线程之外,不应该从任何线程执行GUI操作 QApplication。因此,您的异常处理程序必须在主线程中运行并通过信号槽机制调用:

from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import pyqtSignal

class MyThread(QtCore.QThread):
    somethingIsWrong = pyqtSignal(Exception)

    def run(self):
        try:
            raise FileExistsError
        except FileExistsError as e:
            self.somethingIsWrong.emit(e)

class Window(QtGui.QWidget):
    def __init__(self):
        super(QtGui.QWidget, self).__init__()
        self.button = QtGui.QPushButton('click', self)
        self.button.clicked.connect(self.mythread)

    def mythread(self):
        self.t = MyThread()
        self.t.somethingIsWrong.connect(self.handleException)
        self.t.start()

    def handleException(self, exception):
        self.errorwindow = QtGui.QWidget()
        self.errorwindow.setGeometry(200, 200, 200, 100)
        self.errortext = QtGui.QLabel('error', self.errorwindow)
        self.errorwindow.show()
        print(exception.__class__)