zoukankan      html  css  js  c++  java
  • 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 
    
                            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:UsersAdministratorDesktop测试.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:WindowsSystem32driversetc')
     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 = '注意事项:
    ' 
     4                          '配置测试前端同时需要绑定以下host:
    ' 
     5                          '106.52.161.190 ********
    ' 
     6                          '111.230.187.70 *********
    ' 
     7                          '82.157.72.135 **********
    ' 
     8                          '
    ' 
     9                          '正式环境需要屏蔽以上的host
    ' 
    10                          'host文件路径:
    ' 
    11                          'C:WindowsSystem32driversetchosts
    ' 
    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

  • 相关阅读:
    未能加载文件或程序集“xxx, Version=x.x.x.x, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx”或它的某一个依赖项。系统找不到指定的文件
    RabbitMQ本地正常,发布到服务器上 出行连接失败
    Windows 服务 创建 安装 卸载 和调试
    CSS 格式化 一行一条
    ES6---new Promise()讲解,Promise对象是用来干嘛的?
    Win Server 2008 R2 IIS 默认只能添加一个 443 HTTPS 端口
    MVC 部分视图:Partial() 、RenderPartial() 、 Action() 、RenderAction() 、 RenderPage() 区别
    ;(function ($, undefined){ })(jQuery); 的使用及说明
    JS中的call()方法和apply()方法用法总结
    MongoDB服务无法启动,windows提示发生服务特定错误:100
  • 原文地址:https://www.cnblogs.com/jc-home/p/14447850.html
Copyright © 2011-2022 走看看