如何在Python PyQt5中将变量分配给工作线程?

2023-12-06

我使用pyqt5设计了一个GUI程序。我有一个主线程和一个工作线程。当 GUI 启动时,我会从用户那里获得一些输入,例如年龄、姓名……并且我想在工作人员中处理这些输入。例如我如何发送我使用的输入self.ui.firstname.text()给工人?换句话说,self.ui.firstname.text()在工作人员内部无法访问,我无法获取名字输入的值。更好地说,我想从工作线程访问 GUI 输入,但我不知道如何做到这一点。

class Worker(QObject):
    finished = pyqtSignal()
    
    def run(self):
        firstname = self.ui.firstname.text()

        for i in range(10):
        
            sleep(1)
            print(firstname )
        self.finished.emit()

class MyAPP(QDialog):
    def __init__(self,parent=None):
        super().__init__(parent)

        self.setFixedSize(1180, 850)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.runWorkerBtn.clicked.connect(self.runLongTask)

   def runLongTask(self):
       
        self.thread = QThread()
     
        self.worker = Worker()
  
        self.worker.moveToThread(self.thread)
       
        self.thread.started.connect(self.worker.run)
        self.worker.finished.connect(self.thread.quit)
        self.worker.finished.connect(self.worker.deleteLater)
        self.thread.finished.connect(self.thread.deleteLater)
        self.thread.start()



我真的很感谢对这个问题的任何帮助


您可以通过向工人类添加新属性来完成此任务。只需确保它不会遮蔽对象中的任何其他属性、方法、槽或信号即可。这样,您现在可以通过参数区域从初始化将数据传递到线程:

class Worker(QObject):
    finished = pyqtSignal()
    def __init__(self, text="Foo"):
        QObject.__init__(self)
        self.firstNameText = text

On your 主线程,当您创建工作对象时,您可以使用我们刚刚设置的参数放置传递数据:

# On Main Thread
wk = Worker("Hello World")
wk.moveToThread(...)

现在,当我们打印firstNameText上的变量其他线程,它将打印:Hello World.


但是,如果您需要在线程已经运行时将数据传递给该线程,那就是另一回事了:我们必须考虑线程安全 and 同步。让我们使用firstNameText变量为例。想象一下它从字符串开始设置Foo:

  1. 如果在期间怎么办主线程,我们决定将该值更改为Oof同时,从其他线程?哪个值将其他线程打印?我们无法确定,要么是Foo or Oof.
  2. 如果在期间怎么办主线程,我们决定将该值更改为Oof同时,其他线程尝试将该值更改为ABC然后打印它。将打印哪个值其他线程?再说一遍,我们不能确定,要么是Oof or ABC.

如果您仍然对此示例感到困惑,请阅读有关如何多线程 or 多重处理 works.

为了防止这个问题,我们必须使用互斥体来同步对firstNameText两个线程之间的变量。幸运的是,Qt 已经提供了QMutex类,所以让我们使用它。

当我们创建线程时主线程,我们必须分享QMutex:

# ...
mt = QMutex()
th = QThread()
wk = Worker()
wk._mutex = mt
wk.moveToThread(th)
# ...

如果您想在任何情况下修改此变量其他线程或在主线程到另一个值,例如:wk._mutex = None,如果两个线程仍然同时运行,这就会出现问题。您没有对该变量的独占访问权限,所以要小心。当您知道只有 1 个线程访问此属性时,只需在没有任何互斥体的情况下执行此操作即可。

但是如果两个线程都到达只读 the Worker._mutex属性,无论是加锁还是解锁,我们都不需要再担心线程安全的问题了。属性的状态永远不会改变,所以无论是否主线程 or the 其他线程正在访问它时,worker 的实例仍将存在,并由该属性存储。

现在,当我们想要传递一个值时主线程侧 to the 其他线程,我们可以简单地写:

# On main thread:
wk._mutex.lock()
wk.firstNameText = myInput.text()
wk._mutex_unlock()

# On the other thread:
self._mutex.lock()
text = self.firstNameText
self._mutex.unlock()

里面的一切lock and unlock锁定这些锁的线程之间的调用是线程安全的。如果你永不解锁锁定的锁,尝试再次锁定它的其他线程将卡在该函数调用上,因此使用它们时要非常小心。永远不要忘记解锁它们。

为了保持简单易用,我们可以将所有这些都放在两个单独的方法中,一个setter and a getter:

class Worker(QObject):
    finished = pyqtSignal()

    def __init__(self):
        QObject.__init__(self)
        self.firstNameText = ""
        self._mutex = QMutex()

    def getFirstName(self):
        self._mutex.lock()
        text = self.firstNameText
        self._mutex.unlock()
        return text

    def setFirstName(self, text):
        self._mutex.lock()
        self.firstNameText = text
        self._mutex.unlock()
    
    def run(self):
        firstname = self.getFirstName()
        for i in range(10):
            sleep(1)
            print(firstname)
        self.finished.emit()

并从你的主线程,您可以随时致电:

wk.setFirstName("Hello World 2")

If the 其他线程仍在运行,这就是将在终端上打印的值。

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

如何在Python PyQt5中将变量分配给工作线程? 的相关文章

  • Erlang:到 Python 实例的端口没有响应

    我正在尝试通过 Erlang 端口与外部 python 进程进行通信 首先 打开一个端口 然后通过 stdin 将消息发送到外部进程 我期待在进程的标准输出上得到相应的答复 我的尝试如下所示 open a port Port open po
  • 如何把父母和孩子联系起来?

    有两个简单的类 一个只有parent属性 并且两者兼而有之parent and children属性 这意味着同时具备两者的人parent and children继承自唯一的parent 这是只有parent属性 我们就这样称呼它吧Chi
  • DynamodB:如何更新排序键?

    该表有两个键 filename 分区键 和eventTime 排序键 我要更新eventTime对于某些filename Tried put item and update item 发送相同的filename与新的eventTime但这些
  • 如何在 Pandas Python 中按 id 对行进行排名

    我有一个像这样的数据框 id points1 points2 1 44 53 1 76 34 1 63 66 2 23 34 2 44 56 我想要这样的输出 id points1 points2 points1 rank points2
  • Python Requests 库重定向新 url

    我一直在浏览 Python 请求文档 但看不到我想要实现的任何功能 在我的脚本中我设置allow redirects True 我想知道该页面是否已重定向到其他内容 新的 URL 是什么 例如 如果起始 URL 为 www google c
  • 动态字段取决于 WTForms 的先前字段

    我正在使用 WTForms 制作表格 目前 我有这个 class UploadForm flask wtf Form fichier wtforms fields FileField u Fichier description wtform
  • 如何用函数记录一个文件?

    我有一个带有函数 lib py 但没有类的python 文件 每个函数都有以下样式 def fnc1 a b c This fonction does something param a lalala type a str param b
  • Python speedtest.net,或等效的[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否有一个 Python 库可以实现 SpeedTest net 测试或等效的互联网连接速度测试 GitHub上有一个项目叫速度检查 https gi
  • 如何找到多个 pandas 数据框中一对列与任意顺序对的交集?

    我有多个 pandas 数据框 为了简单起见 假设我有三个 gt gt df1 col1 col2 id1 A B id2 C D id3 B A id4 E F gt gt df2 col1 col2 id1 B A id2 D C id
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • multiprocessing.Queue 中的 ctx 参数

    我正在尝试使用 multiprocessing Queue 模块中的队列 实施 https docs python org 3 4 library multiprocessing html exchang objects Between p
  • Python 在哪些系统上不使用 IEEE-754 双精度浮点数

    Python 对 IEEE 754 浮点运算进行了各种引用 但不保证1 https docs python org 3 tutorial floatingpoint html 2 https pythondev readthedocs io
  • Snakemake:将多个输入用于具有多个子组的一个输出的规则

    我有一个工作管道 用于下载 比对和对公共测序数据执行变体调用 问题是它目前只能在每个样本的基础上工作 i e作为每个单独测序实验的样本 如果我想对一组实验 例如样本的生物和 或技术复制 执行变体调用 则它不起作用 我试图解决它 但我无法让它
  • 获取多个同名请求参数

    我的问题是给定的代码 from flask import Flask request app Flask name app route def hello return str request values get param None a
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 如何检测一个二维数组是否在另一个二维数组内?

    因此 在堆栈溢出成员的帮助下 我得到了以下代码 data needle s which is a png image base64 code goes here decoded data decode base64 f cStringIO
  • PyQt5按钮lambda变量变成布尔值[重复]

    这个问题在这里已经有答案了 当我运行下面的代码时 它显示如下 为什么 x 不是 x 而是变成布尔值 这种情况仅发生在传递到用 lambda 调用的函数中的第一个参数上 错误的 y home me model some file from P
  • PyObjC + Python 3.0 问题

    默认情况下 Cocoa Python 应用程序使用默认的 Python 运行时版本 2 5 如何配置我的 Xcode 项目以便它使用较新的 Python 3 0 运行时 我尝试用新版本替换项目中包含的Python framework 但它不
  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM
  • 使用 python 将 CSV 文件上传到 Microsoft Azure 存储帐户

    我正在尝试上传一个 csv使用 python 将文件写入 Microsoft Azure 存储帐户 我已经发现C sharp https blogs msdn microsoft com jmstall 2012 08 03 convert

随机推荐

  • 如何创建仅在链接 pthread 时才使用互斥体的库?

    我正在 Linux 上创建一个 C 库 它有多个函数 它们一起对一些全局数据进行操作 为了使这些函数是线程安全的 它们必须在代码中的适当位置使用互斥体 在 Linux 中 为了在应用程序中使用 pthreads 需要链接到适当的库 lp线程
  • 在触摸设备上的浏览器中禁用双击“缩放”选项

    我想要disable the 双击缩放功能性在指定元素上在浏览器中 在触摸设备上 无需禁用所有缩放功能 例如 可以多次点击一个元素来发生某件事 这在桌面浏览器上运行良好 如预期 但在触摸设备浏览器上 它会放大 仅 CSS 解决方案 Add
  • SQL 忽略 WHERE 子句

    M SSMS SQL 我的 WHERE 子句中的这一行抛弃了我的 WHERE 子句的其余部分 WHERE AND b DESIGNATION IS NOT NULL OR c DESIGNATION IS NOT NULL 由于某种原因 当
  • JfreeChart自定义票据标签

    我正在使用 JFreechart 在生成的报告中绘制图表JasperReports 实际上我正在使用动态报告它使用 JasperReports 我正在策划一个barchart我想在轴上的标签上添加自定义字符串 图片会更好地解释一切 Now
  • 在保存为 PNG 之前将新创建的 iOS 图像旋转 90 度

    我已经阅读了许多与此相关的答案 但我仍然无法让它工作 我有一个用户可以在其中签名的视图 它看起来是这样的 http d pr i McuE 我可以成功检索该图像并将其保存到文件系统 但我需要在保存之前将其旋转 90 度 以便签名从左到右读取
  • mysql_real_escape_string 和 array_map 返回空白字符串?

    我还没有学会如何使用参数化查询 根据本网站上的其他一些帖子 这是我明天早上绝对需要做的第一件事 并且我想将大量表单数据放入查询中 转义 我两次遇到过这个解决方案 POST array map mysqli real escape strin
  • Amazon SES 从实例配置文件元数据服务器检索凭证时出错。 (客户端错误:404)

    在让 AWS SES 正常工作时遇到一些问题 我想从我的网站向用户发送电子邮件 看起来凭证没有经过验证 但是我使用了从 IAM 生成的正确凭证 我还尝试了服务器根密钥 但它给了我同样的错误 我已经没有关于如何进一步解决 调试的想法 因此任何
  • Spring Batch 和 Cloudera hadoop 版本不兼容

    我正在尝试 Spring Batch 字数统计程序并遇到这样的版本问题 ERROR org springframework batch core step AbstractStep
  • 函数生成;更改其他功能的默认值(部分)

    我需要一个函数生成器 它接受另一个函数和该函数的任何参数并设置新的默认值 我以为 hadley 的pryr partial这就是那个神奇的功能 它完全符合我的要求 只是您无法更改新的默认值 所以在这里我可以改变sep在我的新paste函数
  • 线程安全数据集

    我想让 DataTable DataSet 的更新操作成为线程安全的 有大约 20 个线程 每个线程使用以下命令更新大约 40 行全局 DataTableRows Find pk 数据表的方法 每个线程将更新 DataTable 的不同行
  • 如何提高 boost Interval_map 查找的性能

    我正在使用一个boost icl interval map将字节范围映射到一组字符串 该地图是从 已排序的 磁盘文件加载的 然后我使用下面的代码进行查找 问题是查找速度非常慢 在我的测试中 我在地图中插入了 66425 个范围 我分析了代码
  • 如何在多索引 Pandas 数据框中按组更新前 N 行的值?

    我正在尝试更新多索引数据框中的前 N 行 但在寻找解决方案时遇到了一些麻烦 所以我想为它创建一个帖子 示例代码如下 Imports import numpy as np import pandas as pd Set Up Data Fra
  • AWS Cloudformation 中 UserData 中的参考参数值

    我在参数部分有这个 Parameters PlatformSelect Description Cockpit platform Select Type String Default qa 1 AllowedValues qa 1 qa 2
  • 使用 javascript 播放以 Base64 编码的 .wav 声音文件

    我能够通过以下方式用 javascript 播放声音 var snd new Audio sound wav snd play 这会播放所需的声音 但有时加载速度很慢 甚至可能根本不加载 所以我用 Base 64 对声音进行编码并尝试以这种
  • 找不到添加到 xcode 7 的自定义字体的名称

    我在获取自定义字体的名称时遇到问题 我将字体添加到我的项目中 并选中 如果需要则复制 选项 我将字体名称添加到应用程序提供的 info plist 标签 Fonts 中 我将字体添加到复制捆绑资源中 该字体出现在自定义选项卡下的情节提要中
  • FileStore 4.2.1 分步示例

    我想要上传 csv 文件 验证它 然后上传到现有模型中 然而 我正在使用 ATK4 2 1 发现 google 搜索到的示例代码要么缺少一些步骤 要么与版本 4 2 1 不相关 为此 在我的第一步中 我尝试混合和匹配代码 试图让文件存储启动
  • mod_rewrite:删除尾部斜杠(只有一个!)

    我使用 mod rewrite htaccess 来获得漂亮的 URL 我使用此条件 规则来消除尾随斜杠 或者更确切地说 通过 301 重定向重写到非尾随斜杠 URL 我这样做是为了避免重复内容 因为我喜欢没有尾随斜杠的 URL更好的 Re
  • 为什么 Canvas API 在循环中使用错误的颜色填充这些路径的部分内容?

    我创建了一个JSFiddle所有代码均处于活动状态并正在运行 相关JS在这里 const canvas document getElementById base const ctx canvas getContext 2d const cW
  • Lambda 未加载加密共享库

    我正在使用 AWS Lambda 中的加密库 我已在 Amazon Linux VM 中使用 pip 编译了该包 我已将包作为图层上传 不管怎样 每次我调用库时 我都会遇到一个根本不具有描述性的错误 Unable to import mod
  • 如何在Python PyQt5中将变量分配给工作线程?

    我使用pyqt5设计了一个GUI程序 我有一个主线程和一个工作线程 当 GUI 启动时 我会从用户那里获得一些输入 例如年龄 姓名 并且我想在工作人员中处理这些输入 例如我如何发送我使用的输入self ui firstname text 给