我正在嘗試制作防病毒應用程式,但遇到了一些問題。按下“立即掃描”按鈕后,GUI 變得不可點擊且無回應,但程式仍在我的 IDE 中運行。我想限制每秒讀取的檔案,這可能嗎?或者這個問題還有其他解決方案嗎?

這是我的編碼:
def md5(self,fname):
hash_md5 = hashlib.md5()
try:
with open(fname, "rb") as f:
for chunk in iter(lambda: f.read(2 ** 20), b""):
hash_md5.update(chunk)
except Exception:
pass
return hash_md5.hexdigest()
def get_all_abs_paths(self,rootdir):
self.progressBar['value'] = self.progressBar['value'] 5
viruslist = open('C:\FYP\SecuCOM2022\compile.txt','rt')
virusinside = [l.rstrip() for l in viruslist]
paths = list()
virus="detected"
novirus="clear"
for dirpath,_,filenames in os.walk(rootdir):
for f in filenames:
paths.append(os.path.abspath(os.path.join(dirpath, f)))
def getfile(self):
file2=('C:/Windows/System32')
file3=('C:/Program Files')
self.status.set("Scanning...")
self.progressBar['value'] = self.progressBar['value'] 5
self.get_all_abs_paths(file3)
self.progressBar['value'] = self.progressBar['value'] 45
self.get_all_abs_paths(file2)
self.status.set("Finished Scan")
self.progressBar['value'] = self.progressBar['value'] 50
uj5u.com熱心網友回復:
需要創建一個執行緒來運行掃描功能,見https://pypi.org/project/pythread/
現在發生的是 Tkinter gui 和 scan 函式在應用程式的同一個唯一執行緒中運行,所以當 scan 函式運行時,gui 不是,這就是它凍結的原因。
通過創建執行緒,您將同時并行運行 gui 和 scan 函式。
uj5u.com熱心網友回復:
Tkinter GUI 有一個mainloop,呼叫任何函式都會導致它暫停,直到函式退出。您可以在單獨的執行緒上運行該函式,以便在完成任務時允許 GUI 的其余部分作業。
uj5u.com熱心網友回復:
GUI 工具包tkinter是事件驅動的。要正常作業,
mainloop必須能夠持續處理鍵盤和滑鼠事件。當它不處理事件時,它會啟動計劃的空閑任務。
因此,它們的作業方式與僅從上到下運行的普通 Python 腳本截然不同。
一個tkinter程式內運行mainloop。所以在開始主回圈之前你只需要做三件事。
- 創建一個帶有一些小部件的視窗。
- 創建保存程式狀態的物件(變數)。
- 定義可以從
mainloopas回呼或 空閑任務運行的函式。
呼叫回呼以回應激活控制元件(如單擊按鈕)。當系統不忙于處理事件時,系統會在指定的毫秒數后啟動空閑任務。您可以使用該Tk.after()方法安排空閑任務。
基本上,回呼和空閑任務是您的程式。
為了保持 GUI 回應,回呼和空閑任務不應花費太長時間;說 50 毫秒。
因此,在單個回呼中運行完整的防病毒掃描確實會使 GUI 無回應。
基本上,存在三種可能的解決方案。
- 將掃描程序分成小塊。第一部分在回呼中執行,其余部分在空閑任務中完成。這可能是最簡單的解決方案,因為它可以讓您在掃描時輕松更新 GUI。
- 使用
multiprocessing啟動一個單獨的程式做了掃描。設定一個Pipe以啟用程式之間的通信。使用空閑任務從管道讀取訊息并更新 GUI。 - 使用
threading啟動一個單獨的執行緒來執行掃描。然而,這可能仍會影響 GUI,因為 CPython 中的全域解釋器鎖 (GIL) 強制一次只有一個執行緒可以執行 Python 位元組碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/356571.html
上一篇:Promise
