Python3+PYQT5 實現並打包exe小工具(1)


前言:

由於項目原因,配置測試環境與正式環境切換頻率很高,且環境內容會因不同開發提測而變化,固寫了一鍵切換環境與自定義修改環境內容的工具。用於記錄

一:實現邏輯:

1、讀取注冊表中客戶端的安裝目錄,把通用的環境配置文件添加到固定目錄下實現配置測試環境;

2、通過讀取注冊表中客戶端的安裝目錄,遍歷固定目錄下的文件,刪除環境文件實現恢復正式環境;

3、配置了測試環境后,遍歷找到文件,調用電腦記事本打開文件,進行自定義環境配置;

4、測試環境需要搭配host,找到hosts文件,實現自定義修改host;

5、通過PYQT5實現gui界面調用函數,自由切換、修改環境;

 

二:代碼實現:

  以下是各函數定義

   定義窗體樣式及大小

 1  def initUI(self):
 2         # 窗口大小
 3         self.setWindowTitle('前端環境配置')
 4         self.setGeometry(400,400,410,300)
 5 
 6         # 文本框與按鈕設置
 7         self.textbox = QTextEdit(self)
 8         self.textbox.setPlainText(self.text_tips)
 9         self.textbox.setStyleSheet(' border: 0px solid #1C72DD; font-size:14px; font-family: Microsoft \n
                        YaHei;color: #333333;font-weight : bold;
') 10 self.textbox.move(30, 15) 11 self.textbox.resize(350, 160) 12 13 self.btn1 = QPushButton('測試環境通用版',self) 14 self.btn1.move(60,190) 15 16 self.btn2 = QPushButton('正式環境',self) 17 self.btn2.move(220,190) 18 19 self.btn3 = QPushButton('自定義ini文件', self) 20 self.btn3.move(60, 240) 21 22 self.btn4 = QPushButton('自定義host文件', self) 23 self.btn4.move(220, 240) 24 25 # 按鈕點擊行為 26 self.one = self.btn1.clicked.connect(self.buttonClicked_1) 27 self.two = self.btn2.clicked.connect(self.buttonClicked_2) 28 self.three = self.btn3.clicked.connect(self.buttonClicked_3) 29 self.four = self.btn4.clicked.connect(self.buttonClicked_4)

  獲取注冊表中客戶端的安裝路徑

 1 def get_Installation_path(self):
 2         # 根據鍵的路徑打印key值
 3         key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,
 4                                   'SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\kdesk', 0,
 5                                   win32con.KEY_READ)
 6 
 7         # 打印該路徑下的某個鍵值
 8         key_vule = win32api.RegQueryValueEx(key, "InstallLocation")
 9         # 元組轉換成列表,刪除多余元素。獲取客戶端安裝路徑
10         self.key_vule_new = list(key_vule).pop(0)
11         self.key_vule_pak = self.key_vule_new + 'cef'
12         self.key_vule_ini = self.key_vule_new + 'data'

  配置測試環境以及錯誤彈框的提示

 1     def get_pak_ini_path(self):
 2         # path_txt = r'C:\Users\Administrator\Desktop\測試.txt' # 在路徑前面加r,即保持字符原始值的意思。
 3         self.get_Installation_path()
 4         dir_or_inifiles = []
 5         dir_or_pakfiles = []
 6         dir_or_inifiles = os.listdir(self.key_vule_ini)
 7         dir_or_pakfiles = os.listdir(self.key_vule_pak)
 8         # 判斷ini是否存在,如存在點擊彈窗提示,避免重復點擊操作
 9         for ini in dir_or_inifiles:
10             ini_filepath = os.path.join(self.key_vule_ini, 'wallpaperurl.ini')
11             if os.path.isfile(ini_filepath):
12                 QtWidgets.QMessageBox.critical(self, '提示', '當前已是測試環境前端')
13                 break
14             else:
15                 pass
16         # 判斷pak是否存在,如存在則只添加部署ini,否則兩者都部署(當客戶端開啟,重復添加會導致工具退出,因pak依賴客戶端,開啟狀態不能添加刪除pak)
17         for pak in dir_or_pakfiles:
18             pak_filepath = os.path.join(self.key_vule_pak, 'devtools_resources.pak')
19             if os.path.isfile(pak_filepath):
20                 if os.path.exists(r'./wallpaperurl.ini'):
21                     shutil.copy(r'./wallpaperurl.ini', self.key_vule_ini)
22                 else:
23                     QtWidgets.QMessageBox.critical(self, '提示', '工具目錄下無ini后綴文件')
24             else:
25                 if os.path.exists(r'./devtools_resources.pak'):
26                     shutil.copy(r'./devtools_resources.pak', self.key_vule_pak)
27                 else:
28                     QtWidgets.QMessageBox.critical(self, '提示', '工具目錄下無pak后綴文件')

  配置正式環境以及錯誤彈窗提示

 1 def del_pak_ini_path(self):
 2         self.get_Installation_path()
 3         dir_or_files = []
 4         dir_or_files = os.listdir(self.key_vule_ini)
 5 
 6         for f in dir_or_files:
 7             filepath = os.path.join(self.key_vule_ini, 'wallpaperurl.ini')
 8             if os.path.isfile(filepath):
 9                 os.remove(filepath)
10                 break
11             else:
12                 QtWidgets.QMessageBox.critical(self, '提示', '當前已是正式環境前端')
13                 break

  調用系統文本,自定義ini環境文件

 1    def custom_pak_ini_path(self):
 2         self.get_Installation_path()
 3         dir_or_files = []
 4         dir_or_files = os.listdir(self.key_vule_ini)
 5 
 6         for i in dir_or_files:
 7             filepath = os.path.join(self.key_vule_ini, 'wallpaperurl.ini')
 8             if os.path.isfile(filepath):
 9                 # 調用記事本打開ini文件
10                 win32api.ShellExecute(0, 'open', 'notepad.exe', filepath, '', 1)
11                 break
12             else:
13                 # 彈窗提示目錄下無ini文件
14                 QtWidgets.QMessageBox.critical(self,'提示','data路徑無ini后綴文件,請先配置測試環境')
15                 break

  調用系統文本,自定義修改hosts文件

 1     def custom_pak_hosts_path(self):
 2         dir_or_files = []
 3         dir_or_files = os.listdir('C:\Windows\System32\drivers\etc')
 4 
 5         for host_path in dir_or_files:
 6             host_path = 'C:/Windows/System32/drivers/etc/hosts'
 7             if os.path.isfile(host_path):
 8                 # 調用記事本打開ini文件
 9                 win32api.ShellExecute(0, 'open', 'notepad.exe', host_path, '', 1)
10                 break
11             else:
12                 # 彈窗提示目錄下無ini文件
13                 QtWidgets.QMessageBox.critical(self, '提示', 'etc路徑無hosts文件,請先創建該文件')
14                 break

  定義按鈕事件

1     def buttonClicked_1(self):
2         sender = self.sender()
3         # 引用函數
4         self.initUI()
5         # 按鈕調用操作函數
6         self.one = self.get_pak_ini_path()
7         self.statusBar().showMessage(sender.text()+''+ '已點擊')

  窗口提示內容

 1     def __init__(self):
 2         super().__init__()
 3         self.text_tips = '注意事項:\n' \
 4                          '配置測試前端同時需要綁定以下host:\n' \
 5                          '106.52.161.190 ********\n' \
 6                          '111.230.187.70 *********\n' \
 7                          '82.157.72.135 **********\n' \
 8                          '\n' \
 9                          '正式環境需要屏蔽以上的host\n' \
10                          'host文件路徑:\n' \
11                          'C:\Windows\System32\drivers\etc\hosts\n' \
12 
13         self.initUI()

  創建應用及對象

1 if __name__ == '__main__':
2     app = QtWidgets.QApplication(sys.argv)
3     ui = MainWindow()
4     ui.show()
5     sys.exit(app.exec_())

 

三:建議:

  我之前是寫成兩個文件,執行A文件調用B文件封裝方法的邏輯實現。在調試的時候是沒問題的,但是在打exe包的時候出現了報錯。后根據報錯信息,把兩個文件寫成一個去執行,完美解決。

所以建議不想復雜的話可以寫成一個文件,如果是大佬的話,隨意~

 

四:打包exe工具包傳送門https://www.cnblogs.com/jc-home/p/14448192.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM