日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1.軟件打包安裝程序

利用setupfactory軟件進行客戶端軟件打包,形成一個setup安裝程序。

2. 建立FTP服務器

利用quickeasyftpserver在遠程服務器中建立FTP服務器,放置2個文件,一個setup安裝文件,一個是ver.txt文件,里面寫上軟件的版本號12位,例如20200917V001。

3. 客戶端程序開發

在客戶端程序中點擊升級按鈕后

(1) 程序首先刪除本地的上一次的版本和升級文件,然后從ftp服務器上下載ver.txt,然后判斷服務器的setup版本和當前軟版本是否一致,不一致,就提示用戶升級。

(2) 如果用戶同意升級,就在ftp上下載setup安裝文件。

(3) 下載完成后,再開一個線程執行setup程序,然后把當前的程序關閉,安裝程序會覆蓋當前的程序。

基于Pyqt5的C/S模式客戶端在線升級方案

運行界面1


基于Pyqt5的C/S模式客戶端在線升級方案

運行界面2


基于Pyqt5的C/S模式客戶端在線升級方案

提示框

問題:

這種方法比較簡單,主要問題是不知道ftp文件的下載進度,會有一直卡死的現象。這個原因是進度條的定時器程序刷新UI和FTP下載程序在一個線程中,造成擁塞了。下載時就不能定時中斷,刷新UI了

 

解決方案:

(1) 對于ftp下載采用異步方式,下載完后發送信號給主線程。

(2) 主線程點擊升級按鈕,綁定子線程和對應的回調函數。然后啟動ftp子線程。

(3) 在回調函數中,執行此程序就是下載結束了,這時可以在主線程中啟動,進度條滿格,然后執行分線程執行安裝程序,并在主程序中把自己結束

 

代碼如下:

from update import Ui_MainWindow
from PyQt5 import QtWidgetsfrom PyQt5.QtWidgets import QMessageBoximport sysimport osfrom ftplib import FTP  # 引入ftp模塊import win32processfrom PyQt5.QtCore import QBasicTimer, QThread, pyqtSignalimport timemycurrent_ver = '20200916V001'  # 當前軟件版本號
mynew_ver = ''#異步線程class MyCal(QThread):   #自定義一個信號名    cal_signal = pyqtSignal(int)  #定義信號返回的數值類型    #構造函數    def __init__(self, mypath, filename,parent=None):     #
        super(MyCal, self).__init__(parent)
        self.mypath = mypath
        self.filename=filename
        print("分線程:",self.mypath,self.filename)
    #析構函數    def __del__(self):
        self.wait()
    #該線程主程序    def run(self):
        ##ftp下載程序版本程序        ftp = MyFtp('127.0.0.1)
        ftp.login('admin', '123456')
        ftp.downloadFile(self.mypath, '/down/',  self.filename)
        ftp.close()        print("分線程下載結束:", self.mypath+self.filename)
        self.cal_signal.emit(1)          #發射信號,傳參數
class MyFtp:    ftp = FTP()    def __init__(self, host, port=21):
        self.ftp.connect(host, port)
    def login(self, username, pwd):
        self.ftp.set_debuglevel(2)  # 打開調試級別2,顯示詳細信息
        self.ftp.login(username, pwd)
        print(self.ftp.welcome)
    def downloadFile(self, localpath, remotepath, filename):
        os.chdir(localpath)  # 切換工作路徑到下載目錄        self.ftp.cwd(remotepath)  # 要登錄的ftp目錄
        self.ftp.nlst()  # 獲取目錄下的文件
        file_handle = open(filename, "wb").write  # 以寫模式在本地打開文件
        self.ftp.retrbinary('RETR %s' % os.path.basename(filename), file_handle, blocksize=1024)  # 下載ftp文件
        # ftp.delete(filename)  # 刪除ftp服務器上的文件    def close(self):
        self.ftp.set_debuglevel(0)  # 關閉調試
        self.ftp.quit()
# 主窗體class MainForm(QtWidgets.QMainWindow, Ui_MainWindow):    def __init__(self):
        super(MainForm, self).__init__()
        self.setupUi(self)
        self.timer = QBasicTimer()
        self.step = 0
        # self.myupdate_bt()
    # 進度條控制定時器    def timerEvent(self, event):
        if self.step >= 100:
            self.timer.stop()
            self.pushButton_2.setText('開始進度條')
            self.step = 0
            self.progressBar.setValue(self.step)
            return
        self.step = self.step + 1
        if self.step>=99:
            self.step=99
        self.progressBar.setValue(self.step)
    # 進度條控制    def myprocessbar_bt(self):
        pass        if self.timer.isActive():
            self.timer.stop()
            self.pushButton_2.setText('開始進度條')
        else:
            self.timer.start(100, self)
            self.pushButton_2.setText('停止進度條')
    def myupdate_bt(self):
        pass        myhomedir = os.getcwd()        mypath = os.getcwd() + '\down\'        myfilepath1 = mypath + "ver.txt"
        myfilepath2 = mypath + "setup.exe"
        # 刪除文件        x1 = os.path.exists(myfilepath1)  # True/False        if x1 == True:
            print("刪除文件:" + myfilepath1)
            os.remove(myfilepath1)        x1 = os.path.exists(myfilepath2)  # True/False        if x1 == True:
            print("刪除文件:" + myfilepath2)
            os.remove(myfilepath2)        ##ftp下載程序版本程序        ftp = MyFtp('127.0.0.1)
        ftp.login('admin', '123456')
        ftp.downloadFile(mypath, '/down/', 'ver.txt')
        ftp.close()        print("下載結束:", myfilepath1)
        # 判斷版本        with open(myfilepath1, 'rt') as f1:
            mynew_ver = f1.readline()[0:12]
            self.label_4.setText(mynew_ver)
            self.label_2.setText(mycurrent_ver)
        if mynew_ver != mycurrent_ver:
            x1 = QMessageBox.information(self, "確認信息", "有新版本,確認是否升級", QMessageBox.Yes | QMessageBox.No)
            if x1 == QMessageBox.No:
                os.chdir(myhomedir)                return
            print("開始升級")
            QMessageBox.information(self, "確認信息", "開始下載程序!!")
            self.myprocessbar_bt()#顯示進度條
            # self.timer.start(100, self)
            ##擁塞ftp下載程序            # ftp = MyFtp('127.0.0.1')
            # ftp.login('admin', '123456')
            # ftp.downloadFile(mypath, '/down/', 'setup.exe')
            # ftp.close()            # print("下載結束:", myfilepath2)
            # QMessageBox.information(self, "確認信息", "下載程序結束!!")
            ####異步FTP下載            self.cal = MyCal(mypath, 'setup.exe')  # 點擊按鈕后新建計算的線程
            self.cal.cal_signal.connect(self.cal_callback)  # 連接計算線程的信號
            self.cal.start()  # 開始運行線程
        else:
            QMessageBox.information(self, "確認信息", "已經是最新版本,不用升級")
            os.chdir(myhomedir)            return
        # 省略 使用接收到線程返回的參數        ###執行第三方程序,新線程        #win32process.CreateProcess(myfilepath2, '', None, None, 0, win32process.CREATE_NO_WINDOW, None, None,win32process.STARTUPINFO())
        os.chdir(myhomedir)        print("主程序退出")
        #sys.exit()    def cal_callback(self):  # 接收到計算線程信號后的回掉函數
        pass        print('異步ftp下載結束')        self.step=100
        self.progressBar.setValue(self.step)
        #self.myprocessbar_bt()#顯示進度條
        myhomedir = os.getcwd()        mypath = myhomedir        myfilepath1 = mypath + "\ver.txt"
        myfilepath2 = mypath + "\setup.exe"
        QMessageBox.information(self, "確認信息", "下載結束,開始升級")
        print(myfilepath2)        win32process.CreateProcess(myfilepath2, '', None, None, 0, win32process.CREATE_NO_WINDOW, None, None,win32process.STARTUPINFO())
        sys.exit()# 主程序入口if __name__ == "__main__":
    App = QtWidgets.QApplication(sys.argv)    win_main = MainForm()    win_main.show()    sys.exit(app.exec_())
界面如下

 

基于Pyqt5的C/S模式客戶端在線升級方案

分享到:
標簽:Pyqt5
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定