如何向PyQt QThreadPool运行函数传递参数

2023-12-19

关于此代码的问题:使用 QThreadPool 的多线程 PyQt 应用程序 https://www.learnpyqt.com/courses/concurrent-execution/multithreading-pyqt-applications-qthreadpool/

从下面的代码中,如何将附加参数传递给execute_this_fn from oh_no功能 ?

如果我像参数一样直接传递:

worker = Worker(self.execute_this_fn(arg1, arg2))

并照常接受:

def execute_this_fn(self, progress_callback, a ,b):

我收到错误:

结果 = self.fn(*self.args, **self.kwargs) 类型错误: execute_this_fn() 获得参数“progress_callback”的多个值

甚至有评论说“路径任何参数和 kwargs 来运行函数”,但是正确的语法是什么?

文章中的可执行代码:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

import time
import traceback, sys


class WorkerSignals(QObject):
    '''
    Defines the signals available from a running worker thread.

    Supported signals are:

    finished
        No data

    error
        `tuple` (exctype, value, traceback.format_exc() )

    result
        `object` data returned from processing, anything

    progress
        `int` indicating % progress 

    '''
    finished = pyqtSignal()
    error = pyqtSignal(tuple)
    result = pyqtSignal(object)
    progress = pyqtSignal(int)


class Worker(QRunnable):
    '''
    Worker thread

    Inherits from QRunnable to handler worker thread setup, signals and wrap-up.

    :param callback: The function callback to run on this worker thread. Supplied args and 
                     kwargs will be passed through to the runner.
    :type callback: function
    :param args: Arguments to pass to the callback function
    :param kwargs: Keywords to pass to the callback function

    '''

    def __init__(self, fn, *args, **kwargs):
        super(Worker, self).__init__()

        # Store constructor arguments (re-used for processing)
        self.fn = fn
        self.args = args
        self.kwargs = kwargs
        self.signals = WorkerSignals()    

        # Add the callback to our kwargs
        self.kwargs['progress_callback'] = self.signals.progress        

    @pyqtSlot()
    def run(self):
        '''
        Initialise the runner function with passed args, kwargs.
        '''

        # Retrieve args/kwargs here; and fire processing using them
        try:
            result = self.fn(*self.args, **self.kwargs)
        except:
            traceback.print_exc()
            exctype, value = sys.exc_info()[:2]
            self.signals.error.emit((exctype, value, traceback.format_exc()))
        else:
            self.signals.result.emit(result)  # Return the result of the processing
        finally:
            self.signals.finished.emit()  # Done



class MainWindow(QMainWindow):


    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.counter = 0

        layout = QVBoxLayout()

        self.l = QLabel("Start")
        b = QPushButton("DANGER!")
        b.pressed.connect(self.oh_no)

        layout.addWidget(self.l)
        layout.addWidget(b)

        w = QWidget()
        w.setLayout(layout)

        self.setCentralWidget(w)

        self.show()

        self.threadpool = QThreadPool()
        print("Multithreading with maximum %d threads" % self.threadpool.maxThreadCount())

        self.timer = QTimer()
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.recurring_timer)
        self.timer.start()

    def progress_fn(self, n):
        print("%d%% done" % n)

    def execute_this_fn(self, progress_callback):
        for n in range(0, 5):
            time.sleep(1)
            progress_callback.emit(n*100/4)

        return "Done."

    def print_output(self, s):
        print(s)

    def thread_complete(self):
        print("THREAD COMPLETE!")

    def oh_no(self):
        # Pass the function to execute
        worker = Worker(self.execute_this_fn) # Any other args, kwargs are passed to the run function
        worker.signals.result.connect(self.print_output)
        worker.signals.finished.connect(self.thread_complete)
        worker.signals.progress.connect(self.progress_fn)

        # Execute
        self.threadpool.start(worker) 


    def recurring_timer(self):
        self.counter +=1
        self.l.setText("Counter: %d" % self.counter)


app = QApplication([])
window = MainWindow()
app.exec_()

如果您查看 Worker 类的文档,我们会发现它指示了如何建立附加参数:

class Worker(QRunnable):
    """
    Worker thread

    Inherits from QRunnable to handler worker thread setup, signals and wrap-up.

    :param callback: The function callback to run on this worker thread. Supplied args and 
                     kwargs will be passed through to the runner.
    :type callback: function
    :param args: Arguments to pass to the callback function
    :param kwargs: Keywords to pass to the callback function
    # ...

在您的情况下,您必须更改为:

worker = Worker(self.execute_this_fn, arg1, arg2)

另一方面,如果观察到源代码的以下部分:

# ...
self.kwargs["progress_callback"] = self.signals.progress
# ...

由此可见,progress_callback 是 kwargs 的一部分,必须位于 args 之后,因此您必须将代码更改为:

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

如何向PyQt QThreadPool运行函数传递参数 的相关文章

随机推荐

  • Codeigniter - 使用force_download函数下载文件

    我正在使用最新的 CI 我在当地工作时没有任何问题 但是当我将作品转移到实时服务器时 我遇到了问题 当我从下载选项卡下载文件时 文件将以正确的大小和格式下载 但是当我打开下载的文件时 例如 如果是图像 则图像不显示 或者如果是单词 则要求选
  • Java 不运行带参数的准备语句

    我正在使用PreparedStatement 来查询我的表 不幸的是 我没能做到这一点 我的代码很简单 PreparedStatement preparedStatement connection prepareStatement Sele
  • 我们可以在 Cubism 上使用自定义 JSON 数据吗?

    我看到了立体图 它们简直太神奇了 我有一个很大的 JSON 文件 其中包含 1000 个条目 其中包含时间戳和值 整数 Cubism 可以绘制这些图吗 我似乎找不到这方面的文档 Cubism 通常适用于实时数据 但您可以实现一个仅从 JSO
  • Swift:获取字典中键的数量

    对于快速数组 我们可以简单地使用count属性来找出集合中有多少个元素 然而 我们不能对字典键做同样的事情 执行此操作的唯一方法是使用 for 循环和计数器吗 var myDict String AnyObject intialize di
  • FFmpeg:如何将带有黑边的垂直视频转换为背景边模糊的 16:9 视频

    如何使用 FFmpeg 实现这一点 没有 FFmpeg 的示例 Adobe After Effects http www youtube com watch v yCOrqUA0ws4 索尼维加斯专业版 http www youtube c
  • Snakemake 和 pandas 语法

    我有一个输入文件如下 SampleName Run Read1 Read2 A run1 test true data 4k R1 fq test true data 4k R2 fq A run2 test samples A fastq
  • SQL Server 2012经典asp连接字符串

    我安装了 SQL Server 2012 Express 其中有一个名为BRD我创造的 我还创建了一个测试表 tempDemo 和一个测试存储过程 getStList 在里面BRD数据库 当我在查询窗口中运行存储过程时 它会起作用 因此我相
  • 移动设备上的视觉视口与布局视口

    我刚刚读了一篇关于视口的好文章 http www quirksmode org mobile viewports2 html这给我留下了一些关于移动设备上的视觉视口与布局视口的问题 布局视口的宽度和高度等于任何值 可以以最大缩小模式显示在屏
  • 在 Android 中制作自定义可绘制形状

    我想要像下面这样绘制 我可以在两个不同的 xml 文件中制作矩形和三角形 但我想联合它们来制作这样的可绘制对象 Use layer list制作这个自定义形状drawable res drawable custom shape xml
  • UnsatisfiedLinkError:无法从加载程序加载 X

    我正在尝试使用本机代码创建一个 android 项目来调用 OpenGL 函数 我正在按照本指南来启动该项目 http www learnopengles com calling opengl from android using the
  • 如何让 HtmlUnit 在 Android 下工作?

    这是我的代码 import com gargoylesoftware htmlunit WebClient import com gargoylesoftware htmlunit html HtmlPage final WebClient
  • 关于并行架构的设计模式有什么好的资源吗?

    一些背景知识 我正在开始使用 GPGPU OpenCL 我正在使用 java 包装器 jogamp jocl http jogamp org jocl www 希望它能为我提供一种抽象低级细节并在更高级别使用标准 OOP 的方法 我已经从各
  • delphi 使用记录作为 TDictionary 中的键

    可以使用记录作为 TDictionary 中的键值吗 我想根据字符串 整数和整数的组合来查找对象 TUserParKey record App string ID integer Nr integer end var tmpKey TUse
  • 多个 fbAsyncInit?

    在我的网站中 我使用 Facebook JS SDK 的异步加载 为了实际设置它 我在 window fbAsyncInit 函数中使用标准 FB init 然而问题是 在我的网站中 这个功能位于每个页面上 然而 当我在子页面中时 由于网站
  • 如何替换 Android Gradle 构建文件中已弃用的 PackagingOptions

    我已经迁移到 gradle 8 我的 android 构建 gradle 文件显示 plugins id com android application version 8 1 0 alpha01 apply false id com an
  • Scala 与 F# 的问题:它们如何统一 OO 和 FP 范式?

    Scala 和 F 统一 OO 和 FP 范式的方法之间的主要区别是什么 EDIT 每种方法的相对优点和缺点是什么 尽管支持子类型化 如果 F 可以推断函数参数的类型 那么为什么 Scala 不能呢 我看过 F 做过低级教程 所以我对它的了
  • 电子邮件进入收件箱后如何触发 Google Apps 脚本?

    我创建了一个 Google Apps 脚本 用于检查电子邮件是否有附件 然后将其发送到另一个电子邮件地址 它工作正常 但我想创建一个触发器 一旦新电子邮件到达收件箱就启动脚本 我已经能够创建一个每小时启动脚本的触发器 但这不是我想要的 经过
  • 升级到 Xcode 5.1 和 iOS 7.1 后,segue 转换期间导航栏上出现深色阴影

    当我在主 详细信息导航控制器中的父控制器和子控制器之间来回导航时 我在顶部导航栏的右侧看到一个黑色阴影 它是在我升级到 Xcode 5 1 后开始的 感觉很粗糙而且分散注意力 我怎样才能摆脱它 self navigationControll
  • Rails wrap_parameter 未按预期工作

    我正在使用 AngularJS 和 jQuery file uploader 插件 我已经配置了 Rails 来包装我的参数 ActiveSupport on load action controller do wrap parameter
  • 如何向PyQt QThreadPool运行函数传递参数

    关于此代码的问题 使用 QThreadPool 的多线程 PyQt 应用程序 https www learnpyqt com courses concurrent execution multithreading pyqt applicat