之前写过两篇文章,介绍了使用python+paramiko用脚本的方式,自动部署替换文件。但是脚本写出来后,没有得到广泛应用,部门小伙伴还是倾向于手动在Xshell上替换部署,后来一直寻思着做一个窗口工具,无意中了解了PyQt5这个,后来自己折腾了一段时间,也算是搞出来第一个版本的自动部署工具,主界面如下:
环境准备
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,会自动弹出“新建窗体”对话框,如下图所示(我已经打开了一个文件)
其中:
左边区域Widget Box,主要提供了各种控件,如:按钮、下拉单选框、文本框等,使用时可以直接将这些控件拖到中间的主窗口中,按‘Ctrl+R’可以实现预览窗口
属性编辑器,主要提供了对窗口、控件、布局的属性编辑功能,如名称、坐标位置、字体等
添加完需要的控件后,点击保存后,生成一个.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文件
也可以通过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_())
运行这个脚本,才会有窗口显示
其实这个就是简单的界面与逻辑分离的思想,一般将由.ui文件转换来的.py文件成为 界面文件,由于界面文件经常会发生变化,所以需要新建一个.py文件调用界面文件,这个调用文件成为 逻辑文件。界面文件和逻辑文件是两个相对独立的文件,这样也就实现了界面与逻辑的分离。
结束语
上面主要介绍了环境配置,Qt Designer的简单使用及界面文件的生成转化,关于这个工具具体的逻辑实现,下篇文章介绍。
关于PyQt5 的学习,主要参考了《PyQt5 快速开发与实践》这本书,以及 相关文章,感兴趣的可以去看看,推荐!!!