python桌面应用崩溃_PyQt作为Windows应用程序崩溃而崩溃

一个简单的PyQt程序在Windows上运行时引发APPCRASH,特别是在将输出重定向到QTextEdit时。添加time.sleep调用可以避免崩溃。问题可能与 stdout 重定向代码有关,但具体原因尚不清楚。完整错误信息显示与QtGui4.dll相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个very short PyQt program(注意,这是一个PythonFiddle链接-这在Firefox中似乎崩溃得很厉害,所以下面也发布了代码),它将输出输出输出输出到QTextEdit(使用代码from this SO answer)。当我在Windows上运行代码时,它会导致APPCRASH。一些观察结果:如果我添加一个time.sleep调用(即取消对第53行的注释),那么程序将很好地完成

如果我不将输出重定向到QEdit(即comment out第34行),那么不管time.sleep调用是否被注释掉,它都可以工作

我假设这意味着重定向stdout的代码不知何故被破坏了-但我正在努力理解导致这种行为的错误的原因-感谢收到任何指针!在

完整错误消息

问题签名:

问题事件名称:APPCRASH

应用程序名称: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

pythonfidle在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_())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值