python font 進度條在操作過程中不會更新




python matplotlib pyplot title (4)

在我的python程序上傳一個文件到互聯網,即時通訊使用GTK進度條來顯示上傳進度。 但即時通訊面臨的問題是,進度條在上傳完成後才顯示任何活動,然後突然顯示上傳完成。 即時通訊使用pycurl使http請求...我的問題是 - 我需要有一個多線程應用程序上傳文件,同時更新gui? 還是有一些其他的錯誤,即時通訊?

提前致謝!


Answer #1

我要引用PyGTK FAQ

你已經在一個窗口內創建了一個進度條,然後你開始運行一個循環來完成一些工作:

while work_left:
    ...do something...
    progressbar.set_fraction(...)

您會注意到該窗口甚至沒有顯示出來,或者進度條一直保持凍結直到任務結束。 解釋很簡單:gtk是事件驅動的,你正在從gtk主循環中竊取控制權,從而阻止它處理正常的GUI更新事件。

最簡單的解決方案是每當進度發生變化時暫時將控制權交還給gtk:

while work_left:
    ...do something...
    progressbar.set_fraction(...)
    while gtk.events_pending():
        gtk.main_iteration()

請注意,使用此解決方案,用戶無法退出應用程序(gtk.main_quit將因為新的循環[gtk.main_iteration()])不起作用,直到完成了heavy_work。

另一個解決方案是使用gtk空閒函數,只要它沒有任何功能,它就會被gtk主循環調用。 因此,gtk是在控制之下,而且空閒函數還要做一些工作。 如果還有更多的工作要做,則返回True,否則返回False。

James Henstridge指出了最好的解決方案(它沒有缺點)。 它利用python的生成器作為空閒函數,使python自動為我們保留狀態。 它是這樣的:

def my_task(data):
    ...some work...
    while heavy_work_needed:
        ...do heavy work here...
        progress_label.set_text(data) # here we update parts of UI
        # there's more work, return True
        yield True
    # no more work, return False
    yield False

def on_start_my_task_button_click(data):
    task = my_task(data)
    gobject.idle_add(task.next)

上面的“while”只是一個例子。 唯一的規則是在完成一些工作之後它應該產生True,並且有更多的工作要做,並且在任務完成時它必須產生False。


Answer #2

是的,你可能需要並發性,是線程是一種方法,但如果你使用線程,請使用這樣的方法: http : //unpythonic.blogspot.com/2007/08/using-threads-in-pygtk .html這將抽象的痛苦,讓你專注於重要的方面。

(我沒有通過懶惰,因此在社區維基百科,在該博客文章中重複的一切)。


Answer #3

更有可能的問題是,在你的進度回調,這是我認為你正在更新進度欄,你沒有打電話來手動更新顯示,即運行通過GUI的事件循環。 這只是猜測,如果你可以提供更多的代碼,可能會更容易進一步縮小。

你需要手動更新顯示的原因是因為你的主線程也在執行上傳,這是阻塞的地方。


Answer #4

在Python 2.x整數操作數導致整數除法。 嘗試這個:

#Callback function invoked when download/upload has progress
def progress(download_t, download_d, upload_t, upload_d):
    print 'in fileupload progress'
    mainwin.mainw.prog_bar.set_fraction(float(upload_d) / upload_t)




pygtk