亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何避免特金特 GUI 在蟒蛇 3 中凍結?

如何避免特金特 GUI 在蟒蛇 3 中凍結?

慕田峪7331174 2022-09-27 16:40:36
我是python的新手,并制作了一個Tkinter應用程序,當按下開始按鈕時,它將執行目錄中存在的所有python文件。我的 GUI 還具有用于查看當前進度的進度條。所以這是我的代碼import osfrom tkinter import *from tkinter.ttk import *from tkinter import messageboxdirectory = 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 = 0def begin():    global v    for x in files:        os.system('pyinstaller '+x)        v=v+1        p['value']=vp = 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在處理時不要凍結,并在進度條上顯示正確的進度。示例代碼和解釋對我來說會更好。感謝您的寶貴時間...
查看完整描述

2 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

這奏效了。無需使用檢查線程是否已完成。.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()


查看完整回答
反對 回復 2022-09-27
?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

首先,按鈕的參數可以只是:。commandcommand=begin

GUI 工具包(如)是事件驅動的。它們依賴于鍵盤和鼠標事件的順暢流動才能正常工作?;卣{(如來自按鈕)是從事件循環 () 調用的。因此,回調應該只需要很短的時間(例如50毫秒)才能不凍結GUI。因此,切勿在回調中運行長時間運行的循環。你必須以不同的風格編程。tkintercommandroot.mainloop

上面的鏈接將您帶到我網站上的一篇文章,我將簡單的命令行程序與等效的GUI程序進行了比較。雖然該程序不使用外部進程,但它說明了原理。

在 GUI 中執行此操作的正確方法是從按鈕回調開始 。然后使用該方法定期運行檢查 是否已完成的回調,然后啟動新進程。multiprocessing.Processroot.afterProcess


查看完整回答
反對 回復 2022-09-27
  • 2 回答
  • 0 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號