PyQt 作为 Windows APPCRASH 崩溃

2023-12-07

我有一个非常短的 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_())

好的,首先关于程序的线程安全性。因为您正在连接一个QObject到标准输出,调用print将与此互动QObject。但你应该只与QObject来自创建它的线程。您拥有的实现可能是线程unsafe如果你打电话print来自除该线程之外的线程QObject居住在.

在你的情况下,你正在打电话print from a QThreadEmmittingStream(QObject)驻留在主线程中。我建议您更改代码以使其线程安全,如下所示:

self.myLongTask = TaskThread()
sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)
sys.stdout.moveToThread(self.myLongTask)
self.myLongTask.start()

请注意,现在调用print从应用程序的主线程调用将导致线程不安全行为。由于您目前没有这样做,所以现在没问题,但请注意!

我真的建议你阅读http://qt-project.org/doc/qt-4.8/threads-qobject.html并理解它所谈论的一切。了解该文档是避免由于线程而导致烦人的崩溃的关键。

--

现在,崩溃的问题显然是由您的调用引起的processEvents()。我还没锻炼过why(我想它与线程有关......),但我可以告诉你,你不需要那条线!因为您正在使用信号/槽,一旦normalOutputWritten方法运行后,控制权无论如何都会返回到 Qt 事件循环,并且它将继续正常处理事件。因此无需强制 Qt 处理事件!

希望有帮助!

EDIT:有关如何使您的EmittingStream/print调用线程安全,请参见这里:从辅助线程将 stdout 和 stderr 重定向到 PyQt4 QTextEdit

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt 作为 Windows APPCRASH 崩溃 的相关文章

  • celery任务eta已关闭,使用rabbitmq

    我使用教程中的默认设置和在 ubuntu 上运行的rabbitmq 使 Celery 任务正常进行 当我毫不延迟地安排任务时 一切都很好 但是当我给他们一个预计时间时 他们会被安排在未来 就好像我的时钟在某个地方关闭了一样 下面是一些请求任
  • 按每个元素中出现的数字对字符串列表进行排序[重复]

    这个问题在这里已经有答案了 我有一个脚本 其目的是对不断下载到服务器上的空间数据集文件进行排序和处理 我的列表目前大致如下 list file t00Z wrff02 grib2 file t00Z wrff03 grib2 file t0
  • 学习Python中的解析器

    我记得我读过有关解析器的内容 您只需提供一些示例行 它就知道如何解析某些文本 它只是确定两条线之间的差异 以了解可变部分是什么 我以为它是用 python 写的 但我不确定 有谁知道那是什么图书馆吗 可能你的意思是模板制作器 http co
  • 使用ideone时如何传入命令行参数?

    我正在使用 ideone 在线解释器 http ideone com http ideone com 来测试一些 C 和 Python 程序 如何指定命令行参数而不是使用 STDIN 输入 看起来你不能 但是快速破解应该做的伎俩 stati
  • 创建 xyz 海拔数据的曲面图

    我正在尝试用 python 创建一座山的表面图 其中我有一些 xyz 数据 最终结果应该类似于that https i stack imgur com rKQV0 png 该文件的格式如下 616000 0 90500 0 3096 712
  • 在Python中将大文件(25k条目)加载到dict中很慢?

    我有一个大约有 25000 行的文件 它是 s19 格式的文件 每行就像 S214780010 00802000000010000000000A508CC78C 像这样的事情怎么样 我做了一个测试文件 只有一行S21478001000802
  • 如何在plotly(python)中的刻度标签和图形之间添加空格?

    如果我使用绘图创建水平条形图 则每个条形的标签都与图表相对应 我想在标签和图表之间添加一些空间 填充 边距 我怎样才能做到这一点 Example import plotly offline as py import plotly graph
  • 获取字符串模板中所有标识符列表的函数(Python)

    对于标准库string template在Python中 有没有一个函数可以获取所有标识符的列表 例如 使用以下 xml 文件
  • pandas 数据框的最大大小

    我正在尝试使用读取一个有点大的数据集pandas read csv or read stata功能 但我不断遇到Memory Errors 数据帧的最大大小是多少 我的理解是 只要数据适合内存 数据帧就应该没问题 这对我来说不应该是问题 还
  • 将列表值转换为 pandas 中的行

    我有数据帧 其中一列具有相同长度的 numpy ndarray 值 df list 0 Out 92 array 0 0 0 0 29273096 0 30691767 0 27531403 我想将这些列表值转换为数据框并从 df iloc
  • matplotlib:渲染到缓冲区/访问像素数据

    我想使用 matplotlib 生成的图作为 OpenGL 中的纹理 到目前为止 我遇到的 matplotlib 的 OpenGL 后端要么不成熟 要么已经停止使用 所以我想避免使用它们 我当前的方法是将图形保存到临时 png 文件中 并从
  • argparse 不检查位置参数

    我正在创建一个脚本 它使用 argparse 接受位置参数和可选参数 我已经阅读了 Doug 的教程和 python 文档 但找不到答案 parser argparse ArgumentParser description script t
  • 当元组列表中相同项目的值是字符串时,对它们的值求和

    如果我有这样的元组列表 my list books 5 books 10 ink 20 paper 15 paper 20 paper 15 我怎样才能把列表变成这样 books 15 ink 20 paper 50 即添加同一项目的费用
  • 使用具有可变数量索引的 numpy mggrid

    如何将 numpy mgrid 与可变数量的索引一起使用 我在 github 上找不到任何人将其与硬编码值以外的任何内容一起使用的示例 import numpy as np np mgrid 1 10 1 10 this works fin
  • Python GTK3 Treeview 向上或向下移动选择

    如何在树视图中向上或向下移动所选内容 我的想法是 我可以使用向上和向下按钮将选择向上移动一行或向下移动一行 我的 Treeview 使用 ListStore 不确定这是否重要 首先 我将使用我熟悉的 C 代码 如果您在将其翻译为 Pytho
  • 列表中的特定范围(python)

    我有一个从文本字符串中提取的整数列表 因此当我打印该列表 我称之为test I get 135 2256 1984 3985 1991 1023 1999 我想打印或制作一个仅包含特定范围内的数字的新列表 例如1000 2000之间 我尝试
  • 解析整数集的字符串并列出间隔

    I have 2 5 7 9 12 string 我想从中获取 2 5 7 8 9 12 列表 python中有没有内置的函数 Thanks UPD 我想 直接的答案是No 不管怎样 谢谢你的 片段 使用一个 建议者斯文 马尔纳克 s 2
  • Django 中使用外键的抽象基类继承

    我正在尝试在 Django 支持的网站上进行模型继承 以遵守 DRY 我的目标是使用一个名为 BasicCompany 的抽象基类来为三个子类提供通用信息 Butcher Baker CandlestickMaker 它们位于各自的应用程序
  • 尝试 numba 时出现巨大错误

    我在使用 numba 时遇到了大量错误 讽刺的是 正确的结果是在错误之后打印的 我正在使用最新的 Anaconda python 并安装了 numba conda install numba 一次在 Ubuntu 13 64 位和 anac
  • 在自定义 keras 层的调用函数中传递附加参数

    我创建了一个自定义 keras 层 目的是在推理过程中手动更改前一层的激活 以下是基本层 它只是将激活值乘以一个数字 import numpy as np from keras import backend as K from keras

随机推荐

  • 为什么 AnsiSameText 不是 ANSI?

    从名字上看 人们会相信 SysUtils Delphi XE 中定义的 AnsiSameText 将接收 ANSI 字符串作为参数 但该函数的定义如下 function AnsiSameText const S1 S2 string Boo
  • 上传前验证文件大小

    我需要验证要上传到服务器的文件 上传之前必须进行验证 即在客户端完成验证 此任务应在 ASP NET MVC3 网页中完成 它还应该适用于所有浏览器 IE9 8 7 FF Chrome 我发现 IE 没有 FileReader API 我的
  • 无法在 Solr 中使用 ICUTokenizerFactory

    我正在尝试在 Solr 模式中使用 ICUTokenizerFactory 这就是我的定义field and fieldType
  • jQuery 拖动/使用 CSS 变换比例调整大小

    我正在应用 CSS 转换 以及浏览器特定的 webkit o 等 变换 矩阵 0 5 0 0 0 5 0 0 到一个 div 然后在该 div 的子级上使用 jQuery 的draggable 和 ressized 插件 我遇到的问题是 当
  • OnActionExecuting 在标准 asp.NET 中等效吗?

    是否有 MVC NET 的等效项OnActionExecuting在标准 asp net 中 我以为会是Page Load since OnActionExecuting每次执行操作 或加载页面 时都会调用 但当我尝试使用 Page Loa
  • 活动和片段有什么区别?

    根据我的研究 backstack 的概念及其存在方式存在显着差异 Activity When an activity被放置到backstack of activities用户 只需按一下即可导航回到上一个活动back button Acti
  • 如何在C中检查网络设备状态?

    我想检查网络设备状态 例如混杂模式 基本上就像所示ip a命令 也许有人可以把我推向正确的方向 我想在 Linux 的 C 语言中执行此操作 以便可以使用 Linux 特定的头文件 您需要使用SIOCGIFFLAGSioctl 检索与接口关
  • android:如何从我的应用程序打开另一个应用程序?

    我了解在我自己的应用程序中打开另一个活动时如何使用意图和 startActivity 但是如何启动不同的应用程序 具体来说 如何确定用户的设备上是否安装了所需的应用程序 你如何启动该应用程序 如何将参数传递给该应用程序 如何找到特定应用程序
  • 如何在 R 中加载 MASS 库的数据集部分?

    我正在阅读这本关于统计学习 机器学习和 R 的书 其中一个问题是 首先 加载波士顿数据集 波士顿数据集是 R 中的 MASS 库 library MASS 现在数据集包含在对象中Boston 阅读有关数据集的信息 Boston 我不明白语法
  • Spring MVC 事务控制器

    我正在尝试获取一个 Spring MVC 控制器方法 该方法已用 Transactional 注释 如果在该方法返回之前在客户端拉动网络电缆 则该方法将回滚 我似乎无法让它工作 这是一个示例我想要实现的目标 Transactional ro
  • Python 中出现“意外缩进”该怎么办?

    如何纠正 Python 中的 意外缩进 错误 Python 使用行开头的空格来确定代码块的开始和结束时间 您可能遇到的错误有 意外的缩进 这行代码的开头比前一行有更多的空格 但前一行不是子块的开头 例如 if while and for声明
  • 将形状复制到空白画布(OpenCV、Python)

    import numpy as np import cv2 blank image np zeros 40 40 3 np uint8 blank image fill 255 cv2 imshow i blank image cv2 wa
  • Facebook Feed 对话框移动网址:display=wap 问题

    我正在使用此 url 将我的移动网页定向到 Facebook 墙帖对话框页面 但是我似乎无法获取display wap上班 http m facebook com dialog feed app id
  • 为什么我不能继承 Enum 的子类?

    考虑以下代码 from enum import Enum class SubclassOfEnum Enum x 5 print SubclassOfEnum x class SubSubclassOfEnum SubclassOfEnum
  • Android,如何将CSS应用到WebView中?

    我想使用 WebView 以便向用户显示一些段落 在 XML 中 我编写了以下代码
  • RedirectToLocal() 转到不同的 url

    以下代码片段来自我的 ASP NET MVC 5 应用程序 public ActionResult Ask string id if this User Identity IsAuthenticated string retUrl Requ
  • 自定义验证不起作用 - Yii2-app-basic-Yii2

    我昨天发布了一个关于单选按钮自定义验证的问题单选按钮上的强制文本字段 我得到了答案 但是 这并不是准确的答案 但是 它解决了我的一个问题 实际上 我有 2 个单选按钮 个人 Firm 当选择具有 个人 值的单选按钮时 公司名称文本框不应是强
  • Typescript:具有不同参数的泛型数组

    考虑一个这样调用的函数 func object object1 key someKeyOfObject1 object object2 key someKeyOfObject2 它有一个数组 我想强制执行key字段保存所保存对象的键obje
  • 将 Java 代码从 Java 8 语法解析为 Java 7 语法的工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有谁知道有什么工具可以将使用 lambda 和方法引用的 Java 8 代码 在源代码级别 转换为使用匿名内部类的 Java 7 代码吗 我知道关于
  • PyQt 作为 Windows APPCRASH 崩溃

    我有一个非常短的 PyQt 程序 注意 这是一个 PythonFiddle 链接 这似乎在 Firefox 中严重崩溃 因此代码也发布在下面 它将输出打印到QTextEdit 使用代码从这个答案 当我运行代码 在 Windows 上 时 它