基于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 快速开发与实践》这本书,以及 相关文章,感兴趣的可以去看看,推荐!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容