<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python編寫的桌面圖形程序,如何實現(xiàn)版本更新和下載?

          共 2629字,需瀏覽 6分鐘

           ·

          2021-06-19 22:38

          點擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進行關(guān)注

          回復“書籍”即可獲贈Python從入門到進階共10本電子書

          江淮度寒食,京洛縫春衣。
          在Python中我們有很多種方案來編寫桌面圖形用戶界面程序,譬如內(nèi)置的Tkinter、強大的PyQt5PySide2,還有wxPython。借助這些或內(nèi)置或第三方的模塊,我們可以輕松地編寫跨平臺的桌面圖形界面程序。
          同時,我們還能直接使用PyInstallerNuitka、cx_FreezePython第三方程序打包模塊,將編寫好桌面圖形界面程序打包為各個平臺的二進制可執(zhí)行程序文件,比如Windows下的exe程序執(zhí)行文件。
          通常我們會將程序按需打包為單個的exe可執(zhí)行文件或包含整個文件夾的可執(zhí)行文件。


          程序更新


          隨著版本的迭代和功能的優(yōu)化,我們編寫的程序會需要進行更新。
          在 Web 應用中,這個問題幾乎不需要處理,因為只要服務(wù)器更新了,瀏覽器打開的頁面或功能都將是最新的。
          而在桌面圖形界面程序中,則有點棘手。因為我們打包好的程序都是離線分發(fā)的,按照以往的流程,我們需要重新打包程序,然后,在某個頁面放上新版本程序的下載鏈接,最后提醒使用者下載更新。
          如果使用者沒有注意到,那么就涼拌了。
          如何解決呢?我們需要在編寫的桌面圖形界面程序中,額外添加一個更新機制,用于檢測更新、下載更新和完成更新。
          下面我們來介紹一下這個流程。


          檢測更新


          要實現(xiàn)程序的更新,我們首先需要讓程序能夠檢測到軟件存在更新。在這里,我們需要一個遠程的更新服務(wù)器,來提供更新的檢測響應。
          然后,在程序啟動的時候,調(diào)用一個子線程,向遠程服務(wù)器發(fā)起請求,以獲得是否需要進行更新。


          下載更新


          如果沒有程序的更新,自然就略過了。
          如果有程序的更新,我們就需要對新版本的程序進行下載。
          下載有兩種方式:


          1. 直接通過主程序進行下載;

          2. 編寫一個單獨的更新程序,主程序調(diào)用更新程序進行下載;


          直接通過主程序進行下載的方式對于下載是可行的,但是沒法自己覆蓋更新自己。所以我們選擇第二種方式。
          主程序通過一個子線程使用subprocess.Popen()調(diào)用打包為單個文件的更新程序。
          然后更新程序再核對一遍是否存在版本更新,如果存在更新,那么繼續(xù)請求遠程服務(wù)器,下載新版本的程序。

          程序文件的下載,我們可以直接使用requests模塊,示例代碼如下所示:
          def work(self): # 新建一個文件對象 temp_file = os.path.join(self.download_path,'update.zip') # 指定更新包下載的路徑 logger.info("下載臨時文件路徑為:{}".format(temp_file)) with open(temp_file,'wb') as self.fileobj: # 請求更新文件包 f = requests.get(self.download_url, stream=True) # 寫入文件 offset = 0 for chunk in f.iter_content(chunk_size=self.buffer): if not chunk: break self.fileobj.seek(offset) self.fileobj.write(chunk) offset = offset + len(chunk) proess = offset / int(self.filesize) * 100 # logger.info("寫入塊:{},{}".format(offset,proess)) self.download_proess_signal.emit(int(proess))
                 


          解壓覆蓋


          新版本的程序下載完,我們就需要將其解壓到原有的文件夾了。這時候,更新程序和主程序分開打包的好處就出來了,我們通過更新程序?qū)⒄谶\行的主程序進程結(jié)束掉,然后將新版本的程序壓縮包解壓覆蓋現(xiàn)有程序所在的文件夾
          def work(self): # 1.殺死主程序進程 for proc in psutil.process_iter(): if proc.name() == 'xxx.exe': proc.kill() # 2.獲取程序本地路徑 current_path = os.path.dirname(os.path.abspath(__file__)) logger.info("當前程序路徑:{}".format(current_path)) # 3.解壓新版本壓縮包到程序本地路徑 update_file_path = os.path.join(self.download_temp_path, 'update.zip') shutil.unpack_archive( filename=update_file_path, extract_dir=current_path ) # 4.刪除臨時文件夾和文件 os.remove(update_file_path) shutil.rmtree(self.download_temp_path)
          這樣,我們就實現(xiàn)了Python編寫的桌面圖形界面程序的更新檢測、下載和覆蓋安裝。

          ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學習群請在后臺回復【入群

          萬水千山總是情,點個【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

          瀏覽 103
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美亚洲日韩中文在线 | 激情综| 日韩成人激情 | 丁香五月婷婷啪啪啪 | 国产视频swag |