gpt4 book ai didi

pyqt4 - 副线程调用主线程函数

转载 作者:行者123 更新时间:2023-12-05 06:44:46 26 4
gpt4 key购买 nike

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

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

目的是尝试 qthread 使应用程序运行时不会卡住。

我的搜索 Material :

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. 从主线程到工作线程进行通信,

    在定义了 Ui 的类的 init 中创建 qthread 的实例在 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 . .

This way data is passed from main to worker.

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

class MyThread(QtCore.QThread):

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

where required execute signal with different types ( list, str ...) defined in MySignal()

def xyz(self): self.signal.sigStr.emit(message)

希望这对您有所帮助。

关于pyqt4 - 副线程调用主线程函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27623198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com