我用GUI构建了Twitter搜寻器,该GUI可以从任何给定的Twitter帐户中获取最新的20条推文,并将它们保存到csv文件中。
搜寻器应每隔x分钟( timeIntervall )重复y次( times )。当抓取工具当前繁忙时,GUI会冻结,因此我尝试通过线程解决此问题:
app = QtWidgets.QApplication(sys.argv)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("Twitter Crawler")
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.onPushButtonClick)
def onPushButtonClick(self):
def working(self):
url = self.ui.urlInput.text()
timeIntervall = self.ui.timeIntervall.text()
seconds = timeIntervall.split(":")
seconds = int(seconds[0]) * 60 * 60 + int(seconds[1]) * 60
times = self.ui.crawlcount.value()
fetcher = ArticleFetcher(url)
print(times)
firstFetch = True
for count in range(0, times):
if firstFetch:
fetcher.fetch()
firstFetch = False
else:
time.sleep(seconds)
fetcher.fetch()
worker = threading.Thread(target=working, args=(self,))
worker.start()
worker.join()
window = MainWindow()
window.show()
sys.exit(app.exec())
在输入 timeIntervall , times 和 pushButton 之后,单击启动工作线程来处理爬网。该应用程序正在运行,但是GUI仍然冻结。
我怀疑我需要GUI的另一个线程并尝试以下操作:
def gui():
window = MainWindow()
window.show()
sys.exit(app.exec())
rungui = threading.Thread(target=gui)
rungui.start()
rungui.join()
现在,GUI仅非常短暂地打开,然后立即再次关闭。
任何建议如何解决这个问题?还是不使用PyQt线程模块可能很愚蠢?
答案 0 :(得分:0)
线程的join()方法等待线程完成。 启动工作线程时,让它自己运行。如果需要显示进度,请使用Queue并将消息从工作线程发送到主线程(在某个计时器循环中使用get_nowait(),以查看工作线程是否发送了重要的消息)。