Я не могу понять, почему многопоточный код не может получить lineedit.text () - PullRequest
1 голос
/ 26 марта 2019

Я пишу код под штукой:

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)

И поведениеCrolling выглядит так:

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() нет значения?

1 Ответ

0 голосов
/ 26 марта 2019

Вы не должны получать доступ к графическому интерфейсу из другого потока, а с помощью своего кода вы не можете этого сделать, потому что в функции поведенияCurling self ссылается на объект класса Worker, и, очевидно, Worker не имеет атрибута GUI. Решение состоит в том, чтобы передать в качестве аргумента текст при вызове функции поведенияCrolling, для этого вы можете использовать частичное и 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...