2017-06-23 83 views
0

我正在嘗試創建一個GUI,用戶在該按鈕上點擊一個按鈕,應用程序從互聯網下載文件。我想要一個進度條顯示文件下載完成的時間。爲了實現這一點,我已經實現了一個線程來運行進度條的功能,當下載按鈕被點擊。下面是我使用的代碼:下載進度條無法正常工作,Python 3

def progthread(): 
    threading.Thread(target=download).start() 

def download(): 
    blocknum = 0 
    blocksize = 0 
    url = "https://www.python.org/static/img/python-logo.png" 
    filename = "C:\My Python Apps\MyFile.png" 
    response = requests.get(url, stream=True) 
    total_length = response.headers.get('content-length') 

    with open(filename, "wb") as f: 
     for data in response.iter_content(chunk_size=10000): 
      f.write(data) 
      percent = int(blocknum * blocksize/int(total_length)) 

      progress['value'] = percent 

當我運行應用程序,它會下載文件,並沒有錯誤上來。但進度條並沒有做任何事情。我嘗試使用progress.update()progress.update_idletask(),但進度條仍然不起作用。

如何獲取進度條以顯示文件的下載進度?

+0

您還沒有在循環中爲blocknum和blocksize賦值,所以它們始終保持爲0. –

回答

1

問題是,你有循環阻塞tkinter的主循環,所以整個圖形用戶界面鎖定。對於這樣的事情,你應該在一個單獨的線程中啓動下載循環,以便它可以與tkinter主循環同時運行。您可以使用tkinter IntVar從其他線程更新進度欄。

如果你用Minimal, Complete, and Verifiable example更新你的問題,那麼我可以幫你實現。

+0

我不確定如何使它更小。我試過並使用過的代碼的其他版本使用'urllib'包,但是我知道很多網站在使用時會觸發403錯誤,所以我在問題中提供的示例是我已經調整爲不使用'urllib '。但是,我將如何將下載循環放入單獨的線程中? – RedCode

+0

好吧我想通了如何做線程和更新我的問題,但問題仍然存在。我真的不知道如何讓我的例子比這個更小,但我現在只想着,我認爲這可能是下載時獲取塊大小的問題,因爲在我的'urllib'代碼中,它獲得了該值並返回它,但是我不能在使用'requests'包的時候以相同的方式實現它。 – RedCode

+0

我不希望你只把它做成最小化,但是make也是完整且可驗證的。閱讀鏈接。在網上尋求幫助時這很常見。製作一個我可以運行的完整程序,包括進口,以便我可以告訴你問題在哪裏。我當然可以自己做這件事。但是我有更好的事情要做,而不是編寫樣板代碼。 – Novel