проблема передачи данных между qthread и ui? - PullRequest
0 голосов
/ 12 июля 2020

Мне удалось создать программу сканирования gui с использованием Beautiful Soup и PyQt5.

Между прочим, у меня была проблема с gui зависанием, когда программа выполняла повторяющийся оператор. Поэтому я собираюсь использовать QThread.

Но когда я добавляю элементы, относящиеся к gui, в Thread, возникает проблема. (Нет проблем с операционным кодом, который не имеет ничего общего с gui, поэтому я не думаю, что есть какая-либо передача данных между классами.) (Это правильно?)

Я создал простую проблему . ↓

Экран выполнения программы

import sys
import time
from PyQt5 import uic
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


form_class = uic.loadUiType('aaaa.ui')[0]


class Thread1(QThread):
def __init__(self, Main):
    super().__init__(Main)

def run(self):
    i = 1
    while i <= 10:
        print(self.lineEdit.text().strip()) #No data transmission between Main and Thread1??
        time.sleep(1)
        i += 1


class Main(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.initSetting()
        self.initSignal()


    def initSetting(self):
        self.statusBar().showMessage('Wait')
        self.setWindowTitle('aaaa')


    def initSignal(self):
        self.pushButton.clicked.connect(self.printWord)


    def printWord(self):
        self.statusBar().showMessage('Threading')

        x = Thread1(self)
        x.start()



if __name__ == "__main__" :

    app = QApplication(sys.argv)
    aaaa = Main()
    aaaa.show()
    app.exec_()

1 Ответ

0 голосов
/ 12 июля 2020

Используя QThread, насколько я понимаю, передача информации между классами возможна, но для передачи информации из вашего Main класса в ваш Thread1 класс вы должны передать аргументы при создании вашего Thread1 class из вашего Main класса.

Другими словами, ваш Main класс и ваш Thread1 класс не имеют общих переменных или функций. Это отдельные классы.

Вот как я могу это сделать:

class Main(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.initSetting()
        self.initSignal()

    def initSetting(self):
        self.statusBar().showMessage("Wait")
        self.setWindowTitle("aaaa")

    def initSignal(self):
        self.pushButton.clicked.connect(self.printWord)

    def printWord(self):
        self.statusBar().showMessage("Threading")
        some_message = self.lineEdit.text().strip()
        self.thread_1 = Thread1(some_message)
        self.thread_1.start()


class Thread1(QThread):
    def __init__(self, input_message, parent=None):
        QThread.__init__(self, parent)
        self.input_message = input_message

    def run(self):
        i = 1
        while i <= 10:
            print(self.input_message)
            time.sleep(1)
            i += 1

Дайте мне знать, если это поможет.

...