辅助线程调用主线程的函数

2023-12-10

我正在 PyQt 中制作一个 GUI,供用户创建大量数据的备份。

GUI(主线程)正在接受用户的输入。 rsync 命令(用于备份)也在主线程中被调用,因此窗口被冻结。

目的是尝试 qthread,以便应用程序运行而不会冻结。

我的搜索材料:

1 : https://www.youtube.com/watch?v=o81Q3oyz6rg。该视频展示了如何通过在辅助线程中运行其他任务来不冻结 GUI。我已经尝试过并且有效。但它对在工作线程中运行命令没有帮助。

尽管在辅助线程中调用 rsync,GUI 仍然冻结。我究竟做错了什么 ?。

import sys
from PyQt4 import QtCore, QtGui
from backUpUi import Ui_MainWindow
import threading, Queue

class callerThread(QtCore.QThread):

    def __init__(self, func, parent=None, *args, **kwargs):
        super(callerThread, self).__init__(parent)
        self._func = func
        self._args = args
        self._kwargs = kwargs

    def run(self):
        self._func(*self._args, **self._kwargs)


class Monitor(QtCore.QObject):

    updateText = QtCore.pyqtSignal(str)

    def update_list(self):
        t_monitor = callerThread(self.monitor_vector, parent=self)
        t_monitor.daemon = True
        t_monitor.start()

    def monitor_vector(self):
        self.updateText.emit('updated list')


class backUpMain(QtGui.QMainWindow):

    def __init__(self,parent=None):
        super(backUpMain, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.connect(self.ui.okButton, QtCore.SIGNAL("clicked()"), self.startThread)
        self.ui.cancelButton.released.connect(sys.exit)
        self.monitor = Monitor()


    def _handlebackUpdate(self, txt):
        QtGui.QMessageBox.information(self, "thread started!", txt)
        self.ui.logEdit.clear()
        self.ui.logEdit.setText(txt)


    def startThread(self):

        self.monitor = Monitor()
        self.monitor.updateText.connect(self._handlebackUpdate)
        self.monitor.update_list()


    def threadDone(self,text1):
        self.ui.logEdit.append("Worker Thread finished processing %s" % text1)



    def exitWindow(self):
        self.ui.close()


def main():
    app = QtGui.QApplication(sys.argv)
    dialog = backUpMain()
    dialog.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

在寻找答案时,qtcentre 提供了帮助。

  1. 您需要为信号提供单独的类
class MySignal(QtCore.QObject):
    sig = QtCore.pyqtSignal(list)
    sigStr = QtCore.pyqtSignal(str)

该信号用于线程之间的通信。

  1. 从主线程到工作线程进行通信,

    创建 qthread 实例init定义 Ui 的类的 从主线程传递参数init或在需要的地方。

class MyThread(QtCore.QThread):

  def __init__(self, parent = None, *args, **kw):             .           .
      self.setData(*args, **kw)


  def setData(self, userShotList, inData, outData, dept):
      self.userShotList = userShotList            .           .

这样数据就从 main 传递到了worker。

  1. 从工作线程到主线程进行通信

类 MyThread(QtCore.QThread):

  def __init__(self, parent = None, *args, **kw):             .           .           .           .
      self.signal = MySignal()

在需要时执行不同类型的信号(列表、字符串...) 在 MySignal() 中定义

def xyz(self): self.signal.sigStr.emit(消息)

希望这可以帮助。

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

辅助线程调用主线程的函数 的相关文章

  • 从线程返回值

    在 Python 中 如何让线程将元组或我选择的任何值返回给父级 我建议你实例化一个队列 队列 http docs python org library queue html highlight queue Queue Queue在启动线程
  • 在 QThread 中启动 QTimer

    我正在尝试在特定线程中启动 QTimer 但是 计时器似乎没有执行 也没有打印任何内容 与定时器 槽或线程有关吗 main cpp include MyThread h include
  • 在QWebView中设置useragent

    我有一个 QWebView 工作正常 然后 使用来自spynner 的代码 我尝试将useragent 方法绑定到自定义方法 这似乎在spynner 带有QWebPage 中有效 但在这里不起作用 非常感谢任何帮助 代码 def custo
  • PIL 图像到 QPixmap 转换问题

    今天我一直在努力应对这一挑战 我已经利用之前的帖子和其他资源成功地获得了很好的观点 我正在尝试将 PIL Image 转换为 QPixmap 以便可以在 PyQT GUI 上使用 QgraphicsScene 进行显示 但是当图片显示时颜色
  • QThread::start(优先级) 与 Linux

    我正在使用一些QThread基于 KDE Neon 18 04 中的工作线程 基于 Ubuntu 18 04 内核 4 15 0 46 generic 工作线程干扰了我的桌面应用程序 因此我决定降低它们的优先级 Qt 文档QThread s
  • 如何在样式表中使用非标准自定义字体?

    我有一个PyQt4由外部设计的应用程序 qss使用以下代码创建文件 app QtGui QApplication sys argv stylesheet open mystylesheet qss read app setStyleShee
  • 从 QRunnable 发出信号

    我正在尝试从一个发送信号QRunnable到我的主要QObject 但由于某种原因它没有收到它们 这是正确的方法吗 这是一个小测试用例 import sys from PyQt4 QtGui import QApplication from
  • 使用 py2exe 隐藏 Python GUI 应用程序的控制台窗口

    我有一个使用 Qt 实际上是 PyQt4 的 Python 程序 当我从 main py 启动它时 我会得到一个控制台窗口和 GUI 窗口 当然 在 Windows 上 然后我用 py2exe 编译我的程序并成功创建 main exe 但是
  • 自定义小部件的占位符

    我正在从 ui 文件加载 QMainWIndow 基础 另外 我有一个自定义小部件 我想将其放置在表单上的某个位置 目前我在 ui 文件中放入了一个空的QVBoxLayout named placeholder 并在 QMainWindow
  • 应该避免通配符导入吗?

    我正在使用 PyQt 并且遇到了这个问题 如果我的导入语句是 from PyQt4 QtCore import from PyQt4 QtGui import 然后 pylint 会给出数百个 未使用的导入 警告 我犹豫是否要关闭它们 因为
  • PyQt4 中的多列(可能使用 QTreeWidget)

    我正在尝试让 QTreeWidget 的工作方式与此完全相同 在Python中 我不关心多个选项卡 而是关心多个列 这就是我到目前为止所得到的 我不知道如何拥有多个标题 self pointListBox QtGui QTreeWidget
  • pyside-rcc“dyld:库未加载:...”

    我是一个 python 和 Qt 新手 我在运行 pyside rcc 和 Pyrcc4 时遇到一些问题 问题不在于可执行文件的链接 而在于库问题 我不是 Unix 向导 可能也没有帮助 当我跑步时 pyside rcc我收到以下错误 dy
  • QSettings():如何保存到当前工作目录

    对于可以直接从闪存 笔 USB 跳转 拇指驱动器运行的应用程序 为了从一台机器移动到另一台机器的可移植性 将用户设置存储在记忆棒上与应用程序相同的目录中是有意义的 程序正在运行 而不是 Windows Mac Linux 用户或每台机器的系
  • 如何安全地销毁 QThread?

    我想正确地销毁一个QThread在 Qt 5 3 中 到目前为止我已经得到 MyClass MyClass QObject parent QObject parent mThread new QThread this QObject con
  • 如何设置 QTableView 中特定单元格的线条样式?

    我正在使用 QT GUI 我正在使用 QTableView 实现一个简单的十六进制编辑控件 我最初的想法是使用一个有十七列的表格 表的每一行都有 16 个十六进制字节 然后在第十七列中显示该数据的 ASCII 表示形式 理想情况下 我想编辑
  • 如何在 PyQt 中使用 QThreads 双向设置信号和槽?

    这是基于 ekhumoro 答案的后续问题here https stackoverflow com a 52005755 4464653 and here https stackoverflow com a 20818401 4464653
  • 验证随时间变化的连续条件

    我想开发一个Python程序 从某个时刻开始 等待60秒再执行操作 该程序必须具有的另一个功能是 如果我更新初始时间 它必须开始检查条件 我想过用线程来做 但我不知道如何停止线程并以新的开始时间重新启动它 import thread imp
  • 冻结/挂起 tkinter GUI 等待线程完成

    按下按钮后我的界面冻结了 我正在使用线程 但我不确定为什么仍然挂起 任何帮助将不胜感激 提前致谢 class magic def init self self mainQueue queue Queue def addItem self q
  • 在 PyQt 中使用 Windows 7 任务栏功能

    我正在寻找有关将一些新的 Windows 7 任务栏功能集成到我的 PyQt 应用程序中的信息 具体来说 如果已经存在使用新进度指示器的可能性 see here http www petri co il wp content uploads
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r

随机推荐