簡體   English   中英

如何避免 Tkinter GUI 在 Python3 中凍結?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM