qthread 和 ui 之间的数据传输问题?
data transfer problem between qthread and ui?
我使用Beautiful Soup和PyQt5成功创建了一个gui爬虫程序。
顺便说一句,当程序执行重复语句时,我遇到了 gui freeze 的问题。
所以我打算用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_()
使用 QThread
,据我了解,class 之间的信息传输是可行的,但是要将信息从您的 Main
class 传输到您的 Thread1
class,你必须在实例化你的 Thread1
class 时从你的 Main
class.
传递参数
换句话说,您的 Main
class 和您的 Thread1
class 不共享任何变量或函数。它们是分开的 classes.
我可能会这样做:
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
如果有帮助请告诉我。
我使用Beautiful Soup和PyQt5成功创建了一个gui爬虫程序。
顺便说一句,当程序执行重复语句时,我遇到了 gui freeze 的问题。 所以我打算用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_()
使用 QThread
,据我了解,class 之间的信息传输是可行的,但是要将信息从您的 Main
class 传输到您的 Thread1
class,你必须在实例化你的 Thread1
class 时从你的 Main
class.
换句话说,您的 Main
class 和您的 Thread1
class 不共享任何变量或函数。它们是分开的 classes.
我可能会这样做:
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
如果有帮助请告诉我。