为什么我的按钮PySide2不能在Python中工作?

2024-09-30 00:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的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()

我错过了什么


Tags: importselfinitdefline按钮threadthreads
1条回答
网友
1楼 · 发布于 2024-09-30 00:24:38

您的问题在于将信息传递到插槽中QtCore.Signal(str, object)需要一个字符串和一个对象,但只传递一个object。只需将@QtCore.Slot(str,object)更改为@QtCore.Slot(object)并相应地调整信号调用,一切都会正常工作。此外,在完成时终止线程可能是一个好主意

@QtCore.Slot(object)
def downloadCodesReady(self, countCodes):
    self.countCodesLabel.setText(str(countCodes))
    self.thread.terminate()

最后,在downloadCodes函数中添加一些未定义的codes列表

def downloadCodes(self):
    countCodes = 0
    with open(self.myvar, 'r') as f:
        line = f.readline()
        while line:
            # codes.append(line) This one crashes the code
            countCodes = countCodes + 1
            line = f.readline()
    self.downloadCodesReadySignal.emit(countCodes)

即使线程崩溃,它也不会自动终止自身。似乎什么都没发生。最好添加一些退出条件,以防代码无法安全地退出并终止线程

相关问题 更多 >

    热门问题