![](/img/trans.png)
[英]How can I update the text in real time while doing the calculations in a QLabel, without the interface freezing?
[英]How can I update the text in real time while doing the calculations in a QTextEdit, without the interface freezing?
我對 QTextedit 中的實時更新有疑問,因為當我執行時,屏幕在執行計算時會保持 static 幾秒鍾,但我需要的是在 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_()
優化.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_()
耗時的任務會凍結 GUI,因此它們必須在另一個線程中運行,如果您想從輔助線程更新 GUI,則應通過信號發送:
# -*- 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_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.