基于Python3+PyQt5的自动替换部署工具介绍(一)

之前写过两篇文章,介绍了使用python+paramiko用脚本的方式,自动部署替换文件。但是脚本写出来后,没有得到广泛应用,部门小伙伴还是倾向于手动在Xshell上替换部署,后来一直寻思着做一个窗口工具,无意中了解了PyQt5这个,后来自己折腾了一段时间,也算是搞出来第一个版本的自动部署工具,主界面如下:

主界面.png

环境准备

1.Windows环境电脑一台(本人是WIN7,WIN10没有测试过,应该也没问题)
2.Python 3.4.3,这是基本啦,关于python的安装这边就不说啦
3.PyQt5安装 ,可以去官网下载安装,也可以pip install 安装
4.paramiko安装,直接pip install paramiko(看到很多人装这个库遇到很多问题,可能我是幸运的,一下子就装好了)
5.配置pycharm,备注(这个主要用于将Qt Designer设计出来的ui文件转换为py文件,主要参考了 CSDN 上一位小伙伴的文章),配置完了可以直接将设计好的ui文件,转换为py文件,非常方便

Qt Designer的简单使用

Qt Designer是专门用来制作PyQt程序中UI界面的工具,会生成一个后缀为.ui的文件,可以通过命令将.ui文件转换为.py文件,来被其他python文件调用;
打开PyQt5 自带的Qt Designer,会自动弹出“新建窗体”对话框,如下图所示(我已经打开了一个文件)

Qt Designer.png

其中:
左边区域Widget Box,主要提供了各种控件,如:按钮、下拉单选框、文本框等,使用时可以直接将这些控件拖到中间的主窗口中,按‘Ctrl+R’可以实现预览窗口

预览.png

属性编辑器,主要提供了对窗口、控件、布局的属性编辑功能,如名称、坐标位置、字体等

添加完需要的控件后,点击保存后,生成一个.ui文件,用notepad打开,

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>648</width>
    <height>380</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <property name="windowIcon">
   <iconset>
    <normaloff>../22.jpg</normaloff>../22.jpg</iconset>
  </property>
  <widget class="QLabel" name="label_5">
   <property name="geometry">
    <rect>
     <x>20</x>
     <y>270</y>
     <width>81</width>
     <height>21</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <pointsize>12</pointsize>
    </font>
   </property>
   <property name="text">
    <string>重启服务</string>
   </property>
  </widget>

可以看到窗口大小的参数 :

<width>648</width>
<height>380</height>

与Qt Designer打开的.ui文件显示的信息一致
配置好的pycharm,打开.ui文件,选择PyUIC,会自动将这个文件转为一个同名的.py文件

转换工具.png

也可以通过python脚本将.ui文件转化为.py文件,脚本如下所示:

# -*- coding: utf-8 -*-

import os 
import os.path 

# UI文件所在的路径 
dir = './'  

# 列出目录下的所有ui文件
def listUiFile(): 
    list = []
    files = os.listdir(dir)  
    for filename in files:  
        print(filename)
        if os.path.splitext(filename)[1] == '.ui':
            list.append(filename)   
    return list

# 把后缀为ui的文件改成后缀为py的文件名  
def transPyFile(filename): 
    return os.path.splitext(filename)[0] + '.py' 

# 调用系统命令把ui转换成py
def runMain():
    list = listUiFile()
    for uifile in list :
        pyfile = transPyFile(uifile)
        cmd = 'pyuic5 -o {pyfile} {uifile}'.format(pyfile=pyfile,uifile=uifile)  
        os.system(cmd)

if __name__ == "__main__":      
    runMain()

将这个脚本文件放在需要转换的文件的目录下,直接运行就可以转换。
转换的.py脚本,如下:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(648, 380)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../22.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        Form.setWindowIcon(icon)

        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(20, 270, 81, 21))
        font = QtGui.QFont()
        font.setPointSize(12)
        .
        .
        .
        self.retranslateUi(Form)
        self.pushButton.clicked.connect(Form.close)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label_5.setText(_translate("Form", "重启服务"))
        self.filenumber.setItemText(0, _translate("Form", "选择文件"))
        self.filenumber.setItemText(1, _translate("Form", "单个文件"))
       .
       .
        self.start.setText(_translate("Form", "开始部署"))
        self.pushButton.setText(_translate("Form", "关闭"))

脚本太长了,删掉了部分,这个时候如果直接运行这个脚本,是不会有窗口出来的。
新建一个CallWindow.py文件:

#coding=utf-8
#author='Shichao-Dong'

import sys
from PyQt5.QtWidgets import *
from FirstMainWin import Ui_Form

class Main(QMainWindow,Ui_Form):
    def __init__(self,parent=None):
        super(Main,self).__init__(parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)
if __name__=="__main__":
    app = QApplication(sys.argv)
    win = Main()
    win.show()
    sys.exit(app.exec_())

运行这个脚本,才会有窗口显示

窗口.png

其实这个就是简单的界面与逻辑分离的思想,一般将由.ui文件转换来的.py文件成为 界面文件,由于界面文件经常会发生变化,所以需要新建一个.py文件调用界面文件,这个调用文件成为 逻辑文件。界面文件和逻辑文件是两个相对独立的文件,这样也就实现了界面与逻辑的分离。

结束语

上面主要介绍了环境配置,Qt Designer的简单使用及界面文件的生成转化,关于这个工具具体的逻辑实现,下篇文章介绍。
关于PyQt5 的学习,主要参考了《PyQt5 快速开发与实践》这本书,以及 相关文章,感兴趣的可以去看看,推荐!!!

推荐阅读更多精彩内容