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

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

將進度條綁定到線程

將進度條綁定到線程

郎朗坤 2022-04-23 17:04:59
我有一些代碼通過 telnet 會話將一些代碼推送到機器上。在此期間(大約 30 秒),GUI (tkinter) 掛起,似乎程序崩潰了。為了解決這個問題,我想使用進度條。因此,按下“發送”按鈕后,它會打開一個新屏幕。到現在為止還挺好?,F在,我希望進度條在 telnet 腳本完成后停止。所以我研究了一下,我認為我需要使用(多)線程。一旦 telnetthread 完成,progressbarthread 應該停止,我再次看到主屏幕。這是迄今為止的腳本...from tkinter import Button, Tk, HORIZONTALimport timefrom tkinter.ttk import Progressbarimport threadingclass main(Tk):    def __init__(self):        super().__init__()        self.btn = Button(self, text='Run', command=self.pb)        self.btn.grid(row=0,column=0)    def pb(self):        def real_pb():            window = tk.Toplevel(root)            window.progress = Progressbar(window, orient=HORIZONTAL,length=100,  mode='indeterminate')            window.progress.grid(row=1,column=0)            window.progress.start()            time.sleep(10)#to be changed to thread of telnet session//dummyscript            window.progress.stop()            window.progress.grid_forget()            window.destroy()            self.btn['state']='normal'        self.btn['state']='disabled'        threading.Thread(target=real_pb).start()    def dummyscript():        time.sleep(10)        print("slept")root = main()root.mainloop()如何更改time.sleepdummyscript 的長度?
查看完整描述

1 回答

?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

首先,Tkinter 不支持多線程,所以所有關于 GUI 的代碼都應該在主線程中。所以無法在real_pb().


只要進程正在運行,我會做的是使用一個threading.Event在進程完成時將設置的對象。在 Tkinter mainloop 內部,我會定期輪詢 Event 以了解進程是否完成:


from tkinter import Button, Tk, HORIZONTAL, Toplevel

import time

from tkinter.ttk import Progressbar

import threading



class Main(Tk):


    def __init__(self):

        super().__init__()

        self.btn = Button(self, text='Run', command=self.pb)

        self.btn.grid(row=0,column=0)

        self.finished = threading.Event()  # event used to know if the process is finished


    def pb(self):


        def check_if_finished():

            if self.finished.is_set():

                # process is finished, destroy toplevel

                window.destroy()

                self.btn['state']='normal'

            else:

                self.after(1000, check_if_finished)


        window = Toplevel(root)

        window.progress = Progressbar(window, orient=HORIZONTAL,length=100,  mode='indeterminate')

        window.progress.grid(row=1,column=0)

        window.progress.start()

        self.btn['state']='disabled'


        threading.Thread(target=self.dummyscript).start()

        self.after(1000, check_if_finished) # check every second if the process is finished


    def dummyscript(self):

        self.finished.clear()  # unset the event

        time.sleep(10)         # execute script

        print("slept")

        self.finished.set()    # set the event


root = Main()

root.mainloop()


查看完整回答
反對 回復 2022-04-23
  • 1 回答
  • 0 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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