防止 PyQt 消除槽中发生的异常

2024-01-12

据我所知,如果 PyQt 下的插槽中发生异常,异常会打印到屏幕上,但不会冒泡。这在我的测试策略中产生了一个问题,因为如果某个槽中发生异常,我将不会看到测试失败。

这是一个例子:

import sys
from PyQt4 import QtGui, QtCore

class Test(QtGui.QPushButton):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setText("hello")
        self.connect(self, QtCore.SIGNAL("clicked()"), self.buttonClicked)

    def buttonClicked(self):
        print "clicked"
        raise Exception("wow")

app=QtGui.QApplication(sys.argv)
t=Test()
t.show()
try:
    app.exec_()
except:
    print "exiting"

请注意异常如何永远不会退出程序。

有办法解决这个问题吗?


可以创建一个装饰器来包装 PyQt 的新信号/槽装饰器,并为所有槽提供异常处理。还可以重写 QApplication::notify 以捕获未捕获的 C++ 异常。

import sys
import traceback
import types
from functools import wraps
from PyQt4 import QtGui, QtCore

def MyPyQtSlot(*args):
    if len(args) == 0 or isinstance(args[0], types.FunctionType):
        args = []
    @QtCore.pyqtSlot(*args)
    def slotdecorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            try:
                func(*args)
            except:
                print "Uncaught Exception in slot"
                traceback.print_exc()
        return wrapper

    return slotdecorator

class Test(QtGui.QPushButton):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setText("hello")
        self.clicked.connect(self.buttonClicked)

    @MyPyQtSlot("bool")
    def buttonClicked(self, checked):
        print "clicked"
        raise Exception("wow")

class MyApp(QtGui.QApplication):
    def notify(self, obj, event):
        isex = False
        try:
            return QtGui.QApplication.notify(self, obj, event)
        except Exception:
            isex = True
            print "Unexpected Error"
            print traceback.format_exception(*sys.exc_info())
            return False
        finally:
            if isex:
                self.quit()

app = MyApp(sys.argv)

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

防止 PyQt 消除槽中发生的异常 的相关文章

  • 动态向类添加类方法

    我有以下片段 FEED TYPES fan mail Fan Mail review Review tip Tip fan user Fan User fan song Fan Song fan album Fan Album played
  • str.translate 与 str.replace - 何时使用哪一个?

    何时以及为什么使用前者而不是后者 反之亦然 目前尚不完全清楚为什么有些人使用前者以及为什么有些人使用后者 它们有不同的目的 translate只能用任意字符串替换单个字符 但一次调用可以执行多次替换 它的参数是一个特殊的表 它将单个字符映射
  • Flask 中“缺少 CSRF 令牌”,但它在模板中呈现

    问题 当我尝试登录 使用 Flask login 时 我得到Bad Request The CSRF session token is missing但令牌正在呈现 在模板中 secret key 已设置 并且我在本地运行localhost
  • 来自 pandas 数据帧的烛台图,用日期替换索引

    此代码给出了带有移动平均线的烛台图 但 x 轴位于索引中 我需要 x 轴位于日期中 需要做什么改变 import numpy as np import pandas as pd import matplotlib pyplot as plt
  • 如何计算数据框中按另一列的列值分组的一列的连续字符串值?

    我有以下数据框 Levels Labels Confidence 0 Hands 0 8 0 Leg 0 7 0 Eye 0 9 1 Ear 0 9 1 Eye 0 8 2 Hands 0 9 2 Eye 0 8 3 Eye 0 8 我想检
  • 如何在Windows中的Python 3.9下pip安装pickle?

    我需要pickle https docs python org 3 9 library pickle html module pickle包安装在我的下面Python 3 9在 Windows 10 下 我尝试过的 当尝试与pip inst
  • django 模板 - 如何动态访问变量?

    假设我有一个具有以下上下文的 django 模板 data1 this is data1 data2 this is data2 data name data2 现在我知道了data name 假设它是 data2 是否可以用它来访问变量d
  • 带有 mkdocs 的本地 mathjax

    我想在无法访问互联网的计算机上使用 MathJax 和 Mkdocs 因此我不能只调用 Mathjax CDN Config mkdocs yml site name My Docs extra javascript javascripts
  • App Engine NDB:如何访问属性的 verbose_name

    假设我有这个代码 class A ndb Model prop ndb StringProperty verbose name Something m A m prop a string value 当然 现在如果我打印 m prop 它会
  • 设置高亮大括号的 vim 颜色主题

    如何更改突出显示大括号的 vim 配色方案 我希望实际编辑 vim 主题文件以使更改永久生效 问候 克雷格 匹配括号的自动高亮颜色称为MatchParen 您可以通过执行以下操作来更改 vimrc 中的颜色 highlight MatchP
  • 正在使用 PIL 保存损坏的图像

    我遇到一个问题 操作图像像素导致保存损坏的图像 因此 我使用 PIL 打开图像 然后将其转换为 NumPy 数组 image Image open myimage png np image np asarray image 然后 我转置图像
  • 高级描述熊猫

    有没有像 pandas 那样更高级的功能 通常我会继续这样 r pd DataFrame np random randn 1000 columns A r describe 我会得到一份很好的总结 就像这样 A count 1000 000
  • 数据框中 .map(str) 和 .astype(str) 有什么区别

    我有一个数据框 其列名为 col1 和 col2 的整数类型条目 我想将 col1 和 col2 的条目以及其间的 点 连接起来 我搜索并发现添加两个列条目 df col df col1 map str df col2 map str 并添
  • 无法使用 python rasterio、gdal 打开 jp2 (来自哨兵)

    我试图在 python 中将 jp2 栅格产品作为栅格打开 但当我们使用 raterio 和 gdal 包时没有成功 我收到此错误 RasterioIOError b4 jp2 not recognized as a supported f
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org
  • 没有名为“turtle”的模块

    我正在学习并尝试用Python3制作贪吃蛇游戏 我正在进口海龟 我正在使用 Linux mint 19 PyCharm python37 python3 tk Traceback most recent call last File hom
  • 使用 MPI 的 Allreduce 对 Python 对象求和

    我正在使用使用 Python 中的字典和计数器构建的稀疏张量数组操作 我想让并行使用这个数组操作成为可能 最重要的是 我最终在每个节点上都有计数器 我想使用 MPI Allreduce 或另一个不错的解决方案 将其添加在一起 例如 使用计数
  • 如何使用 Python/Django 在 Facebook 中获取(和使用)扩展权限

    我正在尝试编写一个简单的应用程序 让用户授予我的代码写入其页面的 Facebook 流的权限 据我了解 它应该很简单 让用户单击一个按钮 启动一个弹出窗口 其中包含我的 Facebook 应用程序中的页面 在该页面中 他们单击授予的内容流发
  • MoviePY 无法在 Windows 上检测 ImageMagick 二进制文件

    我刚买了一台新笔记本电脑 想要设置MoviePY在那新的Windows 64x Python3 7 0 机器 我对所有内容都进行了三次检查 但是当涉及到我的代码的文本部分时 它向我抛出了这个错误 OSError MoviePy Error

随机推荐

  • Nestjs 的 Swagger Codegen

    我已经使用 Swaggerhub 创建了 api 端点 并成功导出以与 asp net core 一起运行 我想用 Nestjs 测试相同的 api 但我发现用 openapi 进行记录 但反之则不然 将 yaml 转换为 Nodejs 有
  • Grails 日期绑定

    在 Grails 中 可以在控制器中 bindData Book b new Book bindData b params 如果我有一个来自用户输入的具有特定格式 例如 yyyy MM dd 的日期字段怎么办 在Spring中 我们可以使用
  • 如果未找到 Wi-Fi AP,则不会调用 NetworkCallback 的 onUnavailable() 方法

    我正在尝试将我的智能手机连接到 IOT 设备制作的 AP 我将connectivitymanager requestNetwork 与NetworkCallback 一起使用 一切正常 直到我关闭我的AP 并且显然requestNetwor
  • 文件错误(文件,“rt”):无法打开连接[重复]

    这个问题在这里已经有答案了 我是 R 新手 在广泛研究此错误后 我仍然无法找到解决方案 这是代码 我检查了我的工作目录 并确保文件位于正确的目录中 欣赏它 谢谢 pollutantmean lt function directory pol
  • 在选项卡内切换选项卡

    MainActivity java public class MainActivity extends FragmentActivity Fragment TabHost as mTabHost private FragmentTabHos
  • 从一个领域异步复制到另一个领域

    据我了解 Realm只能 应该从主线程访问 我使用两个领域 一个用于存储 脏 数据 这些数据在验证后将被移动到真实领域 到目前为止一切顺利 但我找不到在主线程之外执行此操作的方法 如果我使用写入真实领域realm executeTransa
  • Android:将 android.net.Uri 对象保存到数据库

    我想做的是从用户那里获取选定的铃声 设置 AlarmManager 闹钟以在闹钟关闭时播放该铃声 但我需要将铃声保存在数据库中 以便在手机重启后重置所有警报 我的问题是将铃声 Uri 保存到数据库以便稍后检索的最佳方法是什么 我尝试了以下方
  • 使用带有 FX 的 OpenJDK 的 Azul Zulu Builds 将 JavaFX 项目升级到 JDK 17 后,为什么 IDEA 找不到 JavaFX 包?

    我有一个 Java FX 项目 并使用以下 Azul Zulu Build of OpenJDK with JavaFX 将项目升级到 JDK 17 有谁知道为什么 Intellij 无法从 Azul Zulu Builds of Open
  • 在 Groovy MarkupBuilder 中使用命名空间

    我想要有以下输出
  • 从 C# 列表中选择唯一元素

    如何从列表中选择独特的元素 0 1 2 2 2 3 4 4 5 这样我得到 0 1 3 5 有效去除的所有实例重复的元素 2 4 var numbers new 0 1 2 2 2 3 4 4 5 var uniqueNumbers fro
  • 如何使用 EWS 从 Outlook 联系人读取扩展属性

    我当前正在尝试通过 Microsoft 的 EWS 托管 API 从 Outlook 联系人对象读取某些属性 我从以下位置检索这些联系人对象FindItems 功能 其中一些字段是扩展属性 例如Title or User1领域 我很难阅读它
  • iOS 上 JavaScriptCore 虚拟机的强制垃圾回收

    有没有办法强制 iOS 或 Mac OS JavaScriptCore VM 垃圾收集器运行 我只需要它来测试内存泄漏 所以私有 API 就可以了 使用 JSBase h 中的以下函数 function JSGarbageCollect a
  • 哪些 Knockout.js 绑定是“双向”的?

    Knockout js 拥有双向绑定 并且实例展示 http knockoutjs com examples helloWorld html如何value绑定 当应用于文本输入时 更新视图模型 但是 我尝试更新其他绑定 例如text 发现视
  • Python二进制文件读取问题

    我正在尝试在 Python 中读取一个二进制文件 代表 Matlab 中的矩阵 但我在读取文件并将字节转换为正确的值时遇到问题 二进制文件由一系列 4 字节数字组成 前两个数字分别是行数和列数 我的朋友给了我一个他编写的 Matlab 函数
  • 为什么返回 Java 对象引用比返回原语慢得多

    我们正在开发一个延迟敏感的应用程序 并且一直在对各种方法进行微基准测试 使用jmh http openjdk java net projects code tools jmh 在对查找方法进行微基准测试并对结果感到满意后 我实现了最终版本
  • 如何在Azure Function App中禁用只读模式?

    我从 Azure 门户创建一个新的 Function App v2 然后 我借助 Azure Functions Core Tools v2 3 在本地计算机上启动一个新应用程序 并将其发布到门户上的新应用程序 func init func
  • 如何使用 PHP 从多列中选择最小值

    我有一个包含以下内容的表 6xx 8xx 9xx 11xx 12xx 1 0 01 0 002 0 004 0 001 0 025 2 0 025 0 125 0 002 0 01 0 011 我想找到该列中的最小值 使该列变为绿色 例如
  • 从整数创建 LocalDate 对象

    如果我已经有一个日期的月份 日期和年份作为整数 那么使用它们创建一个日期的最佳方法是什么 LocalDate目的 我找到了这个帖子字符串到本地日期 https stackoverflow com questions 8746084 stri
  • 在 Android 上访问高 fps 相机

    有些手机官方支持高 fps 录制 例如 Galaxy S5 和 S6 我尝试了两者 两者都可以使用默认相机应用程序录制高 fps 视频 60 甚至 120 fps 或者在 S6 上使用 Gear VR 的 直通相机 功能 但是 当您通过标准
  • 防止 PyQt 消除槽中发生的异常

    据我所知 如果 PyQt 下的插槽中发生异常 异常会打印到屏幕上 但不会冒泡 这在我的测试策略中产生了一个问题 因为如果某个槽中发生异常 我将不会看到测试失败 这是一个例子 import sys from PyQt4 import QtGu