简体   繁体   中英

How can I update the text in real time while doing the calculations in a QTextEdit, without the interface freezing?

I have a problem regarding the real-time update in a QTextedit, because when I execute, the screen stays static for a few seconds while it performs the calculations, but what I need is that in the QTextedit the status messages are displayed while advancing with the simulation. I have tried with the use of threads, but I do not understand it very well since it does not work out, if someone could help me with this I would appreciate it, since I do not handle much the Thread issue in Pyqt5. (I do not understand) Thank you very much

I attach the code of the interface:

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_()

Time-consuming tasks freeze the GUI so they must be run in another thread, and if you want to update the GUI from the secondary thread then it should be sent via signals:

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

import os
import sys
import shutil
import getpass
import Optimization

import threading

from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QMainWindow


class CleanWorker(QObject):
    started = pyqtSignal()
    finished = pyqtSignal()
    logSignal = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)

        self.delete_file_count = 0
        self.delete_folder_count = 0

    def clean(self):
        threading.Thread(target=self._execute, daemon=True).start()

    def _execute(self):
        self.delete_file_count = 0
        self.delete_folder_count = 0
        self.started.emit()

        folders = (
            os.path.join("C:/Users", getpass.getuser(), "AppData/Local/Temp"),
            os.path.join(
                "C:/Users/",  # Chrome
                getpass.getuser(),
                r"AppData/Local/Google/Chrome/User Data/Default/Cache",
            ),
            os.path.join(
                "C:/Users/",  # Internet Explorer
                getpass.getuser(),
                r"AppData/Local/Microsoft/Windows/INetCache",
            ),
            os.path.join(
                "C:/Users/",  # Edge
                getpass.getuser(),
                r"AppData/Local/Packages/Microsoft.MicrosoftEdge_8wekyb3d8bbwe/AC/Temp",
            ),
        )

        for folder in folders:
            if os.path.isdir(folder):
                self.task(folder)

        self.logSignal.emit(
            "%d files and %d folders deleted.\n"
            % (self.delete_file_count, self.delete_folder_count)
        )

        self.finished.emit()

    def task(self, folder):
        for file in os.listdir(folder):
            file_path = os.path.join(folder, file)
            print(file_path, file)

            try:

                if os.path.isfile(file_path):
                    os.unlink(file_path)

                    self.logSignal.emit("%s file deleted" % file)
                    self.delete_file_count += 1

                elif os.path.isdir(file_path):
                    if "chocolatey" in file_path:
                        continue
                        shutil.rmtree(file_path)
                        self.logSignal.emit("%s folder deleted" % file)
                        self.delete_folder_count += 1

            except Exception as e:
                self.logSignal.emit("Access Denied: %s" % file)


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


if __name__ == "__main__":
    a = QApplication(sys.argv)

    w = TempRemove()
    o = CleanWorker()
    o.started.connect(w.show)
    o.logSignal.connect(w.ScanInfo.append)
    o.clean()

    sys.exit(a.exec_())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM