在我的PySide2应用程序中,有一个downloadCodesButton
按钮,单击该按钮应该在单独的QThread线程中执行一个函数,并在countCodesLabel
标签中显示一个值。但点击按钮后,什么也没发生。为什么?
我的代码:
import random
import colorama
import time
import os
import sys
import design
import tempfile
from PySide2 import QtWidgets, QtCore, QtGui
class Threads(QtCore.QObject):
running = False
downloadCodesReadySignal = QtCore.Signal(str, object)
myvar = None
def __init__(self, myvar, parent=None):
self.myvar = myvar
super().__init__()
def downloadCodes(self):
countCodes = 0
with open(self.myvar, 'r') as f:
line = f.readline()
while line:
codes.append(line)
countCodes = countCodes + 1
line = f.readline()
self.downloadCodesReadySignal.emit(countCodes)
class WarGenApp(QtWidgets.QMainWindow, design.Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.downloadCodesButton.clicked.connect(self.downloadCodes)
@QtCore.Slot(str, object)
def downloadCodesReady(self, countCodes):
self.countCodesLabel.setText(str(countCodes))
def downloadCodes(self):
fname = QtWidgets.QFileDialog.getOpenFileName(self, 'Открыть файл', '', 'Text files (*.txt)')[0]
self.thread = QtCore.QThread()
self.Threads = Threads(myvar=fname)
self.Threads.moveToThread(self.thread)
self.Threads.downloadCodesReadySignal.connect(self.downloadCodesReady)
self.thread.started.connect(self.Threads.downloadCodes)
self.thread.start()
def main():
app = QtWidgets.QApplication(sys.argv)
form = WarGenApp()
form.show()
app.exec_()
if __name__ == '__main__':
main()
我错过了什么
您的问题在于将信息传递到插槽中
QtCore.Signal(str, object)
需要一个字符串和一个对象,但只传递一个object
。只需将@QtCore.Slot(str,object)
更改为@QtCore.Slot(object)
并相应地调整信号调用,一切都会正常工作。此外,在完成时终止线程可能是一个好主意最后,在
downloadCodes
函数中添加一些未定义的codes
列表即使线程崩溃,它也不会自动终止自身。似乎什么都没发生。最好添加一些退出条件,以防代码无法安全地退出并终止线程
相关问题 更多 >
编程相关推荐