如何阻止qt应用程序冻结主程序?

2024-01-05

例如:

#!/usr/bin/env python3

import sys
from PySide import QtCore, QtGui

class Dialog(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        button = QtGui.QPushButton("test")
        layout = QtGui.QVBoxLayout()
        layout.addWidget(button)
        self.setLayout(layout)

app = QtGui.QApplication(sys.argv)
toast = Dialog()
toast.show()
app.exec_()
print("App freezes the main process!")

在关闭对话框之前,最后一个 print() 函数将不会被执行。

我正在开发一个仅使用 qt 来显示一些不需要用户交互的内容的脚本,因此我更喜欢在后台运行 gui 代码。


这不可能。Qt 文档 http://qt-project.org/doc/qt-5/threads-qobject.html states:

虽然QObject是可重入的,GUI 类,特别是QWidget及其所有子类都是不可重入的。它们只能从主线程。如前所述,QCoreApplication::exec()还必须从那个线程.

(emphasis mine)

这个答案 https://stackoverflow.com/a/22290909/2642204另一方面表明实际上这不是真的:)但是 PySide 似乎坚持官方版本:

这可以通过以下代码示例进行验证:

import sys
import threading
from PySide import QtCore, QtGui

class Dialog(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        button = QtGui.QPushButton("test")
        layout = QtGui.QVBoxLayout()
        layout.addWidget(button)
        self.setLayout(layout)

app = QtGui.QApplication(sys.argv)
toast = Dialog()
toast.show()

t = threading.Thread(target = lambda: app.exec_())
t.daemon = True
t.start()
print("App freezes the main process!")
input()

产生以下输出:

App freezes the main process!
QApplication::exec: Must be called from the main thread

(以及我的机器上的崩溃)。我还验证了该选项creating the app在另一个线程中 - 它可以工作,但在退出时崩溃。


所以解决方案似乎让Qt拥有主线程,并在单独的线程中组织您的处理。这实际上不应该是一个问题:如果您能够很好地分离您的关注点,那么它不会对您的控制台应用程序部分在哪个线程上运行产生影响。

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

如何阻止qt应用程序冻结主程序? 的相关文章

  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐

  • 变长系列

    我试图确定是否可以在 Excel 中编写以下计算 其中 n 是变量并且来自用户输入 n的值是正数并且等于或大于1 是否可以写一个公式而不是使用vba 2 1 2 2 2 3 2 n If n 1 then the calculation w
  • JavaFX:对单击、双击和三次单击的反应

    我正在尝试配置某些操作来响应鼠标单击次数 在我看来 单击和三次单击被检测到并应用 但双击实际上不起作用 我尝试做类似的事情 if doubleClick else if tripleClick else if singleClick 检查顺
  • 使用 CGAffineTransform 倾斜 UIImageView

    我试图倾斜一个矩形 使两个垂直边倾斜但平行 顶部和底部是水平的 我正在尝试使用 CGAffineTransform 并找到了这段代码 但我不知道要在各个部分中放入什么 imageView layer somethingMagic image
  • 如何取消自定义等待

    我读了斯蒂芬 图布的博客 https devblogs microsoft com pfxteam awaiting socket operations 关于为 SocketAsyncEventArgs 制作自定义等待 这一切都很好 但我需
  • Keyvault 身份验证(REST API)

    我对微软分散的文档有点困惑 我创建了一个应用程序 https learn microsoft com en us azure azure resource manager resource group create service prin
  • 在SOLID中,SRP和ISP有什么区别? (单一职责原则和接口隔离原则)

    如何SOLID http en wikipedia org wiki Solid object oriented design 接口隔离原则 与 单一职责原则 有何不同 维基百科SOLID 条目说 http en wikipedia org
  • UIStackView 中的多行标签

    将多行标签 换行符设置为自动换行 放入堆栈视图时 标签会立即丢失换行符并在一行中显示标签文本 为什么会发生这种情况以及如何在堆栈视图中保留多行标签 正确答案在这里 https stackoverflow com a 43110590 566
  • cocoa 再次错误 134100 - (用于打开的模型与用于创建的模型不兼容...)

    我在这里看到了这个问题 但总是 答案是模型已更改 重置模拟器 删除商店 我也收到此错误 但是 这是一个新应用程序 我没有添加 更改实体或属性 我删除了商店 重置了模拟器 但得到了相同的结果 这是商店代码 这个问题还有其他原因吗 NSMana
  • jQuery:分离并重新附加元素而不重新加载内容

    我想知道是否可以使用 jQuery 分离然后将元素 例如 div 重新附加到 DOM 而无需重新加载元素内的内容 考虑这个示例布局 div class row div class col lg 6 div class card img sr
  • 如何在执行剧本时在命令行中添加多个清单文件

    我有一本包含两种不同玩法的剧本 Sample yml name Play1 hosts Host1 tasks name Play2 hosts Host2 tasks 我需要用两个不同的主机运行这个剧本 主机1和主机2 并且这两个不同的主
  • PDO lastInsertId 不适用于事务?

    我是第一次在 MySQL 中使用 PDO 目前只是在玩它 到目前为止 当我尝试在事务中进行插入时 this gt dbh gt beginTransaction sql query ran this gt dbh gt commit ech
  • jquery滑块背景颜色

    我是网络编程新手 我正在尝试创建包含滑块的网站 我目前正在使用 jquery 来创建滑块 我试图在滑块值小于 5 时将滑块的背景颜色更改为红色 在滑块值大于 5 时将其背景颜色更改为绿色 如何实现此目的 我必须使用 CSS 来完成这个任务吗
  • 将 lib 添加到 Rails 3 中的“config.autoload_paths”不会自动加载我的模块

    我在旁边放置了一个文件名 g rbRails root lib文件夹 文件内容是这样的 module Google end 然后我添加 config autoload paths W config root lib Rails root a
  • 具有形状 (n,) 的 Sympylambdaify 数组

    我目前与 sympy 存在以下 问题 我有一个象征性的表达 比如M matrix pi a sin 1 b 我想要lambdify并传递给数值优化器 问题是优化器需要函数来输入 输出形状的 numpy 数组 n 特别是不 n 1 现在我已经
  • cmake 和使用“make -jN”的并行构建

    我正在尝试为我的源树设置一个基于 CMake 的并行构建 但是当我发出 cmake make j2 I get jobserver unavailable using j1 Add to parent make rule 作为警告 有谁知道
  • printf 如何知道 CString 字符数据的地址?

    考虑这个代码片段 struct My operator const char const return my my CStringA s aha printf s s s my another variadic function to ge
  • 如何使RecyclerView中每个项目的大小不同?

    I want to achieve something like this But here s what I get after trying 我已经将项目布局的高度设置为 WRAP CONTENT 但结果仍然相同 我应该怎么办 对于那些
  • SwiftUI 中的描边图像边框

    我正在尝试在 SwiftUI 中重新创建 Apple 的节日灯光图像 来自 Apple India 网站的屏幕截图 预期结果 这是我迄今为止所取得的成就 到目前为止我的理解 图像不是形状 所以我们不能抚摸它们的边界 但我还发现shadow
  • 在 Selenium 中如何处理新窗口?

    我正在编写一个硒脚本来登录并创建新邮件 发送邮件并注销 但是当我单击 新邮件 按钮时 它会打开一个新窗口 在硒中我如何处理这个问题 我是硒的新手 请详细解释一下 使用下面的代码 你必须使用 getWindowHandles 我希望它有帮助
  • 如何阻止qt应用程序冻结主程序?

    例如 usr bin env python3 import sys from PySide import QtCore QtGui class Dialog QtGui QDialog def init self QtGui QDialog