【发布时间】:2020-06-18 13:41:05
【问题描述】:
在我的 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()
我错过了什么?
【问题讨论】:
-
您在
downloadCodes的Threads函数中引用了myvar,但这并不存在于该函数的范围内。 -
@musicamante 你的意思是我需要用 self.myvar 替换 myvar 吗?毕竟,我在 Threads 类的开头声明了变量 myvar,并在 init 中为它分配了一个值
-
更改为
with open(self.myvar, 'r') as f: -
@eyllanesc 我改变了,但在我看来问题出在别的地方。因为按下按钮后,RAM 量增加并达到最大值,处理器负载增加,尽管文件中只有一行
-
readlines 需要加上括号。