我不明白为什么多线程代码无法获得lineedit.text()



我像下面一样编写代码:

class QWidgetUI(QWidget):
    def __init__(self):
        super().__init__()
        self.IDinput = QLineEdit(self)
        self.searchBtn = QPushButton("🔍",self)

并制作多线程代码,如下所示:

def __init__(self, parent=None):
    super(self.__class__, self).__init__(parent)
    self.gui = QWidgetUI()
    self.worker = Worker()
    self.workerThread = QThread()
    self.worker.moveToThread(self.workerThread)
    self.workerThread.start()
    self.connectSignal()
    self.gui.show()
def connectSignal(self):
    self.gui.searchBtn.clicked.connect(self.worker.conductCrolling)

而行为是这样的:

class Worker(QObject):
    def __init__(self, parent = None):
        super(self.__class__, self).__init__(parent)
    @pyqtSlot()
    def conductCrolling(self):
        j = 0
        searchingHtml = urlopen('https://www.twitter.com/{}/media'.format(self.gui.IDinput.text()))

在第一个代码中,self.gui.IDinput.text()具有我输入的正确值。
但是在第三个代码中,为什么8号线的self.gui.IDinput.text()没有任何价值?

您不应该从另一个线程访问 GUI,也不应该使用您的代码访问 GUI,因为在函数 conductCrolling 中,self 引用了 Worker 类的对象,显然 Worker 没有 gui 的属性。解决方案是在调用 conductCrolling 函数时作为参数传递给文本,为此您可以使用部分和 QTimer:

from functools import partial
# ...
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)
        self.gui = QWidgetUI()
        self.worker = Worker()
        self.workerThread = QThread()
        self.worker.moveToThread(self.workerThread)
        self.workerThread.start()
        self.connectSignal()
        self.gui.show()
    def connectSignal(self):
        self.gui.searchBtn.clicked.connect(self.launchTask) # change connection
    def launchTask(self):
        wrapper = partial(self.worker.conductCrolling, self.gui.IDinput.text()) # add text
        QTimer.singleShot(0, wrapper) # invoked conductCrolling function

class Worker(QObject):
    @pyqtSlot(str) # <---- add str
    def conductCrolling(self, text): # <--- add text
        # use text
        searchingHtml = urlopen('https://www.twitter.com/{}/media'.format(text))

最新更新