Python PyQT:如何从工作线程调用 GUI 函数?

2023-12-01

我有一个 pyqt gui 并调用一个长进程(ffmpeg),我将其放在一个单独的线程上以不阻塞 gui。然后,我想在较长命令列表中的一个命令完成时更新进度栏。问题是,我无法在工作线程之外调用 gui 线程中的函数。所以我让在工作线程中运行一个股票代码,但是当我用 while 循环更新进度条并读取股票代码值时,GUI 再次被阻止。我该如何解决这个问题。我当前使用的是 python 线程而不是 Qthread。 感谢您的帮助!

import threading, pexpect

self.cmd_list = ['ffmpeg -i file outfile','and so on']

self.stop_proc = False
self.executeCMD()

def spawn_ffmpeg_cmd(self):
    for cmd in self.cmd_list:
        if self.stop_proc == False:
            thread = pexpect.spawn(cmd)
            print "\nstarted: %s" % cmd
            cpl = thread.compile_pattern_list([pexpect.EOF,"frame= *\d+ fps=*\d+",'(.+)'])

            while True:
                i = thread.expect_list(cpl, timeout=None)
                if i == 0: # EOF
                    print "the sub process exited"
                    self.pgticker += 1
                    break
                elif i == 1:
                    frame_number_fps = thread.match.group(0)
                    print frame_number_fps
                    thread.close
                elif i == 2:
                    pass
    self.startButton.setEnabled(True)


def executeCMD(self):
    self.startButton.setEnabled(False)
    self.pgticker = 0
    threading.Thread(target=self.spawn_ffmpeg_cmd, name="_proc").start()


def stopprocess(self):
    self.stop_proc = True
    self.cmd_list = []
    os.system('pkill ffmpeg') 
    self.pgticker = len(self.cmd_list)
    self.startButton.setEnabled(True)


def updateProgress(self):  
    pgfactor = 100 / len(self.cmd_list)
    progress = 0.0
    progress = pgfactor*int(self.pgticker)
    self.progressBar.setProperty("value", progress)

简而言之:移至QThread并使用Qt的信号和槽,它们是线程之间通信的首选方式。

这个答案提供了一些示例:https://stackoverflow.com/a/6789205/2319400

在您的情况下,使用上面的“SomeObject”版本可能如下所示:

class Worker(QtCore.QObject):

    madeProgress = QtCore.pyqtSignal([int])
    finished = QtCore.pyqtSignal()

    def __init__(self, cmdlist):
        self.cmdlist = cmdlist

    def run(self):
        for icmd, cmd in enumerate(self.cmdlist):
            # execute your work
            # processCommand(cmd)

            # signal that we've made progress
            self.madeProgress.emit(icmd)

        # emit the finished signal - we're done
        self.finished.emit()

然后将此工人移至QThread您创建的实例。 按照链接答案中的模式,您可以连接madeProgress信号 到setValue进度条的插槽:

workerThread = QThread()
workerObject = Worker(cmdlist)
workerObject.moveToThread(workerThread)
workerThread.started.connect(workerObject.run)
workerObject.finished.connect(workerThread.quit)

# create a progressbar with min/max according to
# the length of your cmdlist
progressBar = QProgressBar()
progressBar.setRange(0, len(cmdlist))

# connect the worker's progress signal with the progressbar
workerObject.madeProgress.connect(progressBar.setValue)

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

Python PyQT:如何从工作线程调用 GUI 函数? 的相关文章

  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • 如何在python 3.7中生成条形码

    我正在使用 python 3 7 为了生成条形码 我尝试使用安装 pyBarcode 库pip install pyBarcode 但它显示以下错误 找不到满足 pyBarcode 要求的版本 来自版本 找不到 pyBarcode 的匹配分
  • 补丁 - 为什么相对补丁目标名称不起作用?

    我已经从模块导入了一个类 但是当我尝试修补类名而不使用模块作为前缀时 出现类型错误 TypeError Need a valid target to patch You supplied MyClass 例如 以下代码给出了上述错误 imp
  • Pandas:GroupBy 到 DataFrame

    参考这个关于 groupby 到 dataframe 的非常流行的问题 https stackoverflow com questions 10373660 converting a pandas groupby object to dat
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • Mac OS X 中文件系统的 Unicode 编码在 Python 中不正确?

    在 OS X 和 Python 中处理 Unicode 文件名有点困难 我试图在代码中稍后使用文件名作为正则表达式的输入 但文件名中使用的编码似乎与 sys getfilesystemencoding 告诉我的不同 采取以下代码 usr b
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • Keras:如何保存模型或权重?

    如果这个问题看起来很简单 我很抱歉 但是阅读 Keras 保存和恢复帮助页面 https www tensorflow org beta tutorials keras save and restore models https www t
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • 在 matplotlib 中的极坐标图上移动径向刻度标签

    From matplotlib 示例 http matplotlib org examples pylab examples polar demo html import numpy as np import seaborn as sbs
  • Gspread如何复制sheet

    在 Stackoverflow 上进行谷歌搜索和搜索后 我想我找不到有关如何复制现有工作表 现有模板工作表 并将其保存到另一个工作表中的指南 根据文档 有重复表 https gspread readthedocs io en latest
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • Python:IndexError:修改代码后列表索引超出范围

    我的代码应该提供以下格式的输出 我尝试修改代码 但我破坏了它 import pandas as pd from bs4 import BeautifulSoup as bs from selenium import webdriver im
  • 将seaborn.palplot轴添加到现有图形中以可视化不同调色板

    将seaborn人物添加到子图中是usually https seaborn pydata org examples cubehelix palette html创建图形时通过传递 ax 来完成 例如 sns kdeplot x y cma
  • 在 keras 中保存和加载权重

    我试图从我训练过的模型中保存和加载权重 我用来保存模型的代码是 TensorBoard log dir output model fit generator image a b gen batch size steps per epoch
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud

随机推荐

  • 插入一个元素

    Javascript中是否有一种方法可以在当前节点之后插入一个元素 我知道有一种方法可以在XML的当前节点之前插入一个元素 但是有没有一种方法可以在当前节点之后插入一个元素 在当前节点之后 只需获取当前节点的下一个兄弟节点并在该节点之前插入
  • 对单表使用 Merge 语句

    是否可以对单表使用merge语句 我想在插入之前检查是否已存在相同的值集 则应更新该记录 如果不存在 则应插入该记录 我在互联网上搜索过 但我得到了带有 2 个表的合并语句的示例 我在一张桌子上尝试过 但无法获得积极的结果 我试图检查的值将
  • Realm 数据库中的搜索操作速度

    这是我的模型RealmObject class public class ARDatabase extends RealmObject PrimaryKey private String uid private String namex p
  • 未捕获的类型错误:无法调用未定义的方法“hasChildNodes”

    我正在尝试使用 jquery 中的 ajax 请求读取 XML 下面是代码 它在 IE 中工作正常 但是当我在 Chrome 上运行它时 我遇到了这个错误 未捕获的类型错误 无法调用未定义的方法 hasChildNodes ajax typ
  • 如何从 querySelectorAll 获取所有元素并与 addEventListener 一起使用

    我有一个块 当我单击加号时 会创建 4 个子块 当我单击任何子块加号按钮时 我必须添加 rooms guests plus类 它们增加自0 to 5当单击减号按钮时 rooms guests minus类 以同样的方式减少 const ro
  • 在 Android 上运行模拟器时出错

    我正在尝试在 Android 上运行 PhoneGap 应用程序 当我运行命令时 phonegap run android emulator verbose 我收到这个错误 Running command getprop emu uuid
  • 具有连续分隔符的 strtok_s 行为

    我正在并行解析 3 个值 这些值用特定的分隔符分隔 token1 strtok s str1 separator nextToken1 token2 strtok s str2 separator nextToken2 token3 str
  • Python“使用错误的参数类型调用”错误

    我明白为什么我会收到此错误 它正在寻找我的对象作为参数 并接收字符串值 但我很困惑 不知道解决方案是什么 以下代码片段只是尝试运行此命令 self buttonGroup addButton self ui m001 x 次数 num 0
  • 如何在 Struts 2 中使用 DispatcherListener

    有一个界面DispatcherListener在Struts2中 文档说 一个接口来标记那些想要在init and destroy of a Dispatcher 但是这个接口怎么用呢 如果我创建一个实现这个接口的类 我应该如何将它配置到S
  • 我如何使用空手道测试以 AVRO 格式给出响应的其余端点?

    Karate 对于验证我们提供 json 响应的其余 api 非常有帮助 现在我们有了 api 它可以为我们提供 avro 格式的响应 可能还需要以 avro 格式发送有效负载 我如何使用空手道测试以 AVRO 格式给出响应的其余端点 有什
  • Python/Pandas:如果列有多个值,则转换为列表中具有多个值的单行

    在我的数据框中 我有很多相同的实例AutoNumber有不同的KeyValue String 我想将这些实例转换为单行 其中KeyValue String是由多个唯一值组成的列表 AutoNumber KeyValue String Ref
  • 如何连续向下滚动页面直到找到某个元素? Python 硒

    我对 Linkedin 技能部分的加载更多按钮感到困惑 我在查找按钮的 xpath 时收到此错误 selenium common exceptions NoSuchElementException Message no such eleme
  • xmlHttpRequest abort() 方法不会关闭 Internet Explorer 中的连接

    我有多个xmlHttpRequest在我的页面上 我正在尝试调用abort 对他们所有人的方法 在 FF 中效果很好 另一方面 IE 却没有做任何该死的事情 连接不会关闭 并且在请求完成之前我无法导航到另一个页面 这是什么 为什么 IE 不
  • 从 Angular 5 Universal 获取域名始终返回 127.0.0.1

    我在 Angular 5 应用程序的服务器端渲染方面遇到问题 我需要域来创建正确的链接 应用程序在不同的环境中使用 并且为每个端点创建几个包是个坏主意 所以我尝试使用堆栈中的选项 但我总是得到 127 0 0 1 4000 作为域 主机 我
  • 快速执行命令后获取终端输出

    我使用以下代码在终端中运行一些命令 system the command here 在我想知道运行这个命令的结果是什么之后 例如如果我跑 system git status 我想阅读有关我的存储库中更改的实际信息 有什么办法可以快速做到这一
  • 链表删除节点、简单链表

    我正在尝试实现一个从链表中删除节点的函数 到目前为止 我只能删除列表的第一个节点 3 我尝试从delete转到for循环 我以为内存没有分配好 我已经挣扎了几天 我不明白 请帮助我一点 这是我从大学收到的主题 include
  • 如何在 ASP.NET MVC 中禁用路由值的绑定?

    据我所知 ValueProviderDictionary 从 3 个地方获取绑定值 来自邮寄表格 来自路线值 来自查询字符串 我希望能够禁用第二个和第三个选项 我在这里看到的唯一解决方案是创建我自己的自定义 ValueProvider 复制
  • 网络浏览器打印

    Hi我正在使用 C WPF webbrowser 控件在本地计算机中显示 html 文件 我通过执行 webbrowser 控件的打印命令向我的应用程序添加了打印功能 但 Internet Explorer 的默认行为是在屏幕底部打印文件
  • ggplot2 PDF 输出中的 Unicode 字符

    如何在使用 ggplot2 创建的 PDF 绘图中使用 Unicode 字符作为标签 标题和类似内容 考虑以下示例 library ggplot2 qplot Sepal Length Petal Length data iris main
  • Python PyQT:如何从工作线程调用 GUI 函数?

    我有一个 pyqt gui 并调用一个长进程 ffmpeg 我将其放在一个单独的线程上以不阻塞 gui 然后 我想在较长命令列表中的一个命令完成时更新进度栏 问题是 我无法在工作线程之外调用 gui 线程中的函数 所以我让在工作线程中运行一