在QTextEdit中进行计算时,如何在不冻结界面的情况下实时更新文本?

问题描述 投票:0回答:1

我对QTextedit中的实时更新有问题,因为执行时,屏幕在执行计算时会保持静止几秒钟,但是我需要的是QTextedit中的状态消息在显示时与仿真一起前进。我已经尝试过使用线程,但是由于它无法解决问题,所以我不太了解,如果有人可以帮助我,我将不胜感激,因为我在Pyqt5中处理的线程问题不多。 (我不明白)非常感谢

我附上界面代码:

TempClean.py

# -*- coding:utf-8 -*-

import os
import sys
import shutil
import getpass
import Optimization
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import time

tmp = ""
deleteFileCount = 0
deleteFolderCount = 0

class TempRemove(QMainWindow, Optimization.Ui_OptimalWindow):
    def __init__(self, parent = None):
        super(QMainWindow, self).__init__(parent)
        self.initUI(self)
        self.Clean()

    def Task(self, folderName):
        global tmp, deleteFileCount, deleteFolderCount
        for the_file in os.listdir(folderName):
            file_path = os.path.join(folderName, the_file)
            indexNo = file_path.find('\\')
            itemName = file_path[indexNo + 1:]
            try:
                self.show()
                self.ScanInfo.repaint()
                if os.path.isfile(file_path):
                    os.unlink(file_path)
                    self.ScanInfo.append(str(tmp + ('%s file deleted' % itemName)))
                    deleteFileCount = deleteFileCount + 1


                elif os.path.isdir(file_path):
                    if file_path.__contains__('chocolatey'):
                        continue
                    shutil.rmtree(file_path)
                    self.ScanInfo.append(str(tmp + ('%s folder deleted' % itemName)))
                    deleteFolderCount = deleteFolderCount + 1

            except Exception as e:
                self.ScanInfo.append(str(tmp + ('Access Denied: %s' % itemName)))
            # self.ScanInfo.append(str(tmp))

    def Clean(self):
        self.show()
        self.ScanInfo.setText("")

        folder = 'C:/Users/' + getpass.getuser() + '\AppData\Local\Temp'
        self.Task(folder)

        # Chrome
        folder = 'C:/Users/' + getpass.getuser() + '\AppData\Local\Google\Chrome\User Data\Default\Cache'
        self.Task(folder)

        # Internet Explorer
        folder = 'C:/Users/' + getpass.getuser() + '\AppData\Local\Microsoft\Windows\INetCache'
        self.Task(folder)

        # Edge
        folder = 'C:/Users/' + getpass.getuser() + '\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\Temp'
        self.Task(folder)


        global deleteFileCount, deleteFolderCount
        result = (str(deleteFileCount) + ' files and ' + str(deleteFolderCount) + ' folders deleted.') + '\n'
        self.ScanInfo.append(str(result))


if __name__ == '__main__':
    a = QApplication(sys.argv)
    app = TempRemove()
    app.show()
    a.exec_()

Optimization.py

# -*- coding: utf-8 -*-

import sys

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class Ui_OptimalWindow(object):
    def initUI(self, OptimalWindow):
        OptimalWindow.setObjectName("OptimalWindow")
        OptimalWindow.setWindowTitle('Optimization')
        OptimalWindow.setWindowIcon(QIcon(".\image\Icon.jpg"))
        OptimalWindow.resize(600, 579) 
        OptimalWindow.center()  

        self.title = QLabel(OptimalWindow)
        self.title.setGeometry(QRect(0, 0, 600, 78))
        self.title.setText("")
        self.title.setPixmap(QPixmap(".\OptimalImage\\Optimization.jpg"))

        self.Main = QLabel(OptimalWindow)
        self.Main.setGeometry(QRect(0, 79, 600, 500))
        self.Main.setText("")
        self.Main.setPixmap(QPixmap(".\OptimalImage\\Main.png"))

        self.ScanInfo = QTextEdit(OptimalWindow)
        self.ScanInfo.setGeometry(QRect(40, 109, 500, 400))

    def center(self):
        qr = self.frameGeometry() 
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)

        self.move(qr.topLeft())

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    OptimalWindow = QWidget()
    ui = Ui_OptimalWindow()
    ui.initUI(OptimalWindow)
    OptimalWindow.show()
    app.exec_()
python pyqt pyqt5
1个回答
0
投票

耗时的任务冻结了GUI,因此它们必须在另一个线程中运行,并且如果要从辅助线程更新GUI,则应通过信号发送它:

© www.soinside.com 2019 - 2024. All rights reserved.