[英]How can i avoid Tkinter GUI freezing in Python3?
我是 python 的新手,並制作了一個 Tkinter 應用程序,當按下開始按鈕時,該應用程序將執行目錄中存在的所有 python 文件。 我的 GUI 也有進度條來查看當前進度。
所以這是我的代碼
import os
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox
directory = dir_path = os.path.dirname(os.path.realpath(__file__))
files = os.listdir(directory)
root = Tk()
root.geometry('200x200')
root.maxsize(200,200)
root.minsize(200,200)
root.title('PYTOEXE')
v = 0
def begin():
global v
for x in files:
os.system('pyinstaller '+x)
v=v+1
p['value']=v
p = Progressbar(root,length=200,max=len(files))
b = Button(root,text="Start",command=lambda: begin())
p.place(x=0,y=0)
b.place(x=62,y=30)
root.mainloop()
但我的問題是,每當我按下開始按鈕時,GUI 凍結,代碼開始編譯,完成后,GUI 解凍,進度條立即填滿......
所以我希望 GUI 在處理時不要凍結並在進度條上顯示正確的進度。
示例代碼和解釋對我來說會更好。
感謝您寶貴的時間...
這行得通。無需使用 .after .after()
來檢查線程是否完成。
import os
from tkinter import *
from tkinter.ttk import *
import threading
def use_pyinstaller(): # this function is to execute pyinstaller command and add value to progressbar.
v = 0
for x in files:
os.system('pyinstaller '+x)
v+=1
p['value'] = v
def begin():
threading.Thread(target=use_pyinstaller).start() # create a non-block thread to start the function.
directory = dir_path = os.path.dirname(os.path.realpath(__file__))
files = os.listdir(directory)
root = Tk()
root.geometry('200x200')
root.maxsize(200,200)
root.minsize(200,200)
root.title('PYTOEXE')
p = Progressbar(root,length=200,max=len(files))
b = Button(root,text="Start",command=begin)
p.place(x=0,y=0)
b.place(x=62,y=30)
root.mainloop()
首先,按鈕的command
參數可以是: command=begin
。
像tkinter
這樣的 GUI 工具包是事件驅動的。 它們依賴於流暢的鍵盤和鼠標事件流才能正常工作。 回調(如按鈕的command
)是從事件循環( root.mainloop
)中調用的。 因此,回調應該只需要很短的時間(比如 50 毫秒)就不會凍結 GUI。 因此,您不應該在回調中運行長時間運行的循環。 你必須以不同的風格進行編程。
上面的鏈接將您帶到我網站上的一篇文章,我將一個簡單的命令行程序與等效的 GUI 程序進行了比較。 雖然該程序不使用外部進程,但它說明了原理。
在 GUI 中執行此操作的正確方法是從按鈕回調啟動multiprocessing.Process
。 然后使用root.after
方法定期運行一個回調來檢查Process
是否完成,然后啟動一個新進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.