我有一个非常短的 PyQt 程序(注意,这是一个 PythonFiddle 链接 - 这似乎在 Firefox 中严重崩溃,因此代码也发布在下面),它将输出打印到QTextEdit
(使用代码从这个答案)。当我运行代码(在 Windows 上)时,它会生成 APPCRASH。一些观察结果:
- 如果我添加一个
time.sleep
调用(即取消第 53 行的注释),然后程序就可以正常完成
- 如果我不将输出重定向到 QEdit(即注释掉第 34 行),那么无论是否
time.sleep
调用是否被注释掉
我认为这意味着重定向的代码stdout
不知何故被破坏了 - 但我正在努力理解它出了什么问题导致了这种行为 - 非常感谢收到的任何指示!
完整的错误消息
问题签名:
问题事件名称:APPPCRASH
应用程序名: pythonw.exe
应用程序版本:0.0.0.0
应用程序时间戳:5193f3be
故障模块名称:QtGui4.dll
故障模块版本:4.8.5.0
故障模块时间戳:52133a81
异常代码:c00000fd
异常偏移量:00000000005cbdb7
操作系统版本:6.1.7601.2.1.0.256.48
区域设置 ID:2057
附加信息1:5c9c
附加信息 2:5c9c27bb85eb40149b414993f172d16f
附加信息 3:bc7e
附加信息4:bc7e721eaea1ec56417325adaec101aa
Pythonfiddle 在 Firefox 上崩溃得很严重(至少对我来说),所以下面的代码也如下:
import os, sys, time, calendar, math
from PyQt4 import QtCore, QtGui
class EmittingStream(QtCore.QObject):
textWritten = QtCore.pyqtSignal(str)
def write(self, text): self.textWritten.emit(str(text))
class myWrapper(QtGui.QMainWindow):
def __init__(self):
super(myWrapper, self).__init__()
self.toolbar = self.addToolBar("MainMenu")
self.toolbar.addAction(QtGui.QAction("myProg", self, triggered=self.myProgActions))
def myProgActions(self): self.setCentralWidget(myWidget())
class myWidget(QtGui.QWidget):
def __init__(self):
super(myWidget, self).__init__()
self.myBtn = QtGui.QPushButton('Run!', self)
self.myBtn.clicked.connect(self.startTest)
self.outputViewer = QtGui.QTextEdit()
self.grid = QtGui.QGridLayout()
self.grid.addWidget(self.myBtn)
self.grid.addWidget(self.outputViewer)
self.setLayout(self.grid)
def startTest(self):
self.myLongTask = TaskThread()
sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)
self.myLongTask.start()
def normalOutputWritten(self, text):
cursor = self.outputViewer.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.insertText(text)
self.outputViewer.setTextCursor(cursor)
self.outputViewer.ensureCursorVisible()
QtGui.qApp.processEvents()
class TaskThread(QtCore.QThread):
def __init__(self): super(TaskThread, self).__init__()
def run(self): myProgClass()
class myProgClass:
def __init__(self):
for i in range(0,100):
print "thread", i+1, " ", math.sqrt(i)
#time.sleep(0.005)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
myApp = myWrapper()
myApp.show()
sys.exit(app.exec_())