【问题标题】:Why is my button PySide2 not working in Python?为什么我的按钮 PySide2 在 Python 中不起作用?
【发布时间】: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 需要加上括号。

标签: python pyside2


【解决方案1】:

您的问题在于将信息传递到插槽中。 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)

即使线程崩溃,它也不会自动终止。似乎,什么都没有发生。添加一些退出条件可能是个好主意,以防代码无法运行以安全退出并终止线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2016-04-19
    • 2021-07-21
    • 2010-10-30
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多