文档章节

python3 写的一个通过ftp远程批量处理的工具__界面处理代码

秦琼
 秦琼
发布于 2016/01/27 16:31
字数 617
阅读 142
收藏 6
# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import Qt, QFileDialog, QMessageBox, QStandardItemModel,\
    QModelIndex, QAbstractItemView, QThread, QProgressDialog
from ftpFun import ftpInterface
from ftpXML import ftpXml
import os

class PGThread(QThread):
    _signal = QtCore.pyqtSignal(int)
    pgValue = 0
    def __init__(self, parent = None):
        QThread.__init__(self, parent)
        self._signal.connect(self.parent().setPgValue)
    
    def initTask(self, curInfoL, taskID):
        self.curInfo = curInfoL
        self.taskID = taskID
        '''taskID = 1 upload  taskID = 2 remove  taskID = 3 rename'''
        #self.pgdlg.exec_()
        
    def run(self):
        row = 0
        strInfo = ''
        step = int(100 / len(self.curInfo))
        tmpValue = step
        isContinue = True
        for cur in self.curInfo:
            print(cur)
            if(isContinue):        
                ftpObj = ftpInterface(cur['ip'], 21, 'xxx', 'xxxxx')
                ftpObj.setlocalPath('')
                if(self.taskID == 1):
                    upFilePath = self.parent().folderLineEdit.text()
                    print(upFilePath)
                    ret = ftpObj.ftpUpLoadFile(upFilePath)
                    if(ret == -1):
                        isContinue = False
                        strInfo = "未找到/voicePrompt/1文件夹"
                    elif(ret == -3):
                        isContinue = False
                        strInfo = "请检查输入路径下无文件数据"
                    elif(ret == -2):
                        strInfo = "上传时出现异常"
                    else:
                        strInfo = "文件已上传请检查"
                elif(self.taskID == 2):
                    removePath = self.parent().folderLineEdit.text()
                    ret = ftpObj.ftpRemoveFile(removePath)
                    if(ret == -1):
                        isContinue = False
                        strInfo = "未找到/voicePrompt/1文件夹"
                    elif(ret == -2):
                        strInfo = "删除时出现异常有可能文件不存在"
                    else:
                        strInfo = "文件已删除请检查"
                elif(self.taskID == 3):
                    beforeName = self.parent().beforeLineEdit.text()
                    afterName = self.parent().afterLineEdit.text()
                    tmpName = os.path.basename(afterName)
                    dirName = os.path.dirname(beforeName)
                    aName = dirName + '//' + tmpName
                    ret = ftpObj.ftpRenameFile(beforeName, aName)
                    if(ret == -1):
                        isContinue = False
                        strInfo = "未找到/voicePrompt/1文件夹"
                    elif(ret == -2):
                        strInfo = "修改时出现异常有可能文件不存在"
                    else:
                        strInfo = "文件已修改请检查"
            self.parent().Model.setData(self.parent().Model.index(row, 0, QModelIndex()), cur['name'])
            self.parent().Model.setData(self.parent().Model.index(row, 1, QModelIndex()), strInfo)
            row += 1
            tmpValue += step
            tmpValue += 1
            self._signal.emit(tmpValue)
            print(tmpValue)
        self.parent().logTbView.setModel(self.parent().Model)


class Ui_Ftp(object):
    def setupUi(self, Ftp):        
        self.retranslateUi(Ftp)
        QtCore.QMetaObject.connectSlotsByName(Ftp)
        
        '''设置最小化按钮'''
        self.setWindowFlags(Qt.Widget)
        #self.setWindowFlags(Qt.WindowMaximizeButtonHint)
        self.radioButton.setChecked(True)
        self.ftpPathLineEdit.setText("/voicePrompt/1")
        #self.ftpPathLineEdit.setDisabled(True)
        self.ftpPathLineEdit.setReadOnly(True)
        self.hideRenameElemt(False)
        
        self.ckBoxList = [];
        self.checkBoxSignal()
        
        '''信号和槽'''
        self.allCheckBtn.clicked.connect(self.allCheckBtnClicked)
        self.clearBtn.clicked.connect(self.clearBtnClicked)
        self.isShowArea = False
        self.areaShwoBtn.clicked.connect(self.areaShowBtnClicked)
        self.openBtn.clicked.connect(self.openBtnClicked)
        self.execBtn.clicked.connect(self.execBtnClicked)
        
        
        '''operator'''
        self.radioButton.clicked['bool'].connect(self.upLoadSetting)
        self.radioButton_2.clicked['bool'].connect(self.RemoveFileSetting)
        self.radioButton_3.clicked['bool'].connect(self.RenameFileSetting)
        
        '''ftp ip info'''
        ftpX = ftpXml()
        self.ipInfo = ftpX.getServerInfo()
        
        '''exec log'''
        '''设置qtabview'''
        self.Model = QStandardItemModel()

    def setPgValue(self, value):
        if(value >= 100):
            self.pg.close()
            return
        self.pg.setValue(value)
    
    '''具体执行操作'''
    def execBtnClicked(self):
        ret = self.execLimit()
        if(ret == -1):
            return
        curInfoL = self.getAreaIpInfo()
        if(not curInfoL):
            QMessageBox.warning(self, '错误', '请检查serverinfo.xml是否存在', QMessageBox.Ok)
            return
        
        pt = PGThread(self)
        self.pg = QProgressDialog()
        self.pg.setModal(True)
        self.pg.show()
        
        self.Model.clear()
        self.Model.setRowCount(len(curInfoL))
        self.Model.setColumnCount(2)
        self.Model.setHorizontalHeaderLabels(['地区', '执行情况'])
        self.logTbView.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.logTbView.update()
        taskId = 0
        pgTitle = ''
        if(self.radioButton.isChecked()):
            taskId = 1
            pgTitle = "正在上传..."
        elif(self.radioButton_2.isChecked()):
            taskId = 2
            pgTitle = "正在上传..."
        elif(self.radioButton_3.isChecked()):
            taskId = 3
            pgTitle = "正在修改..."
        self.pg.setWindowTitle(pgTitle)
        self.pg.setLabelText("请稍后...")
        self.pg.setCancelButton(None)
        self.pg.setWindowFlags(Qt.WindowMinimizeButtonHint)
        pt.initTask(curInfoL, taskId)
        pt.start()
            
            
    def getAreaIpInfo(self):
        areaStr = self.areaLineEdit.text()
        areaList = areaStr.split('、')
        '''find areaIp in self.ipinfo'''
        curInfo = []
        for area in areaList:
            for ftpArea in self.ipInfo:
                if(area == ftpArea['name']):
                    ip = ftpArea['ip']
                    curInfo.append(ftpArea)
                    break
        return curInfo
    
    def execLimit(self):
        if(self.areaLineEdit.text() == ""):
            QMessageBox.information(self, "提示", "请输入地区,多个地区用'、'隔开", QMessageBox.Ok)


© 著作权归作者所有

共有 人打赏支持
秦琼
粉丝 3
博文 12
码字总数 4435
作品 0
杭州
架构师
私信 提问
[雪峰磁针石博客]python3快速入门教程11命令行自动化工具与pexpect

[雪峰磁针石博客]python3快速入门教程 命令行自动化与pexpect 简介 Pexpect 是一个用来启动交互式命令行子程序并对其进行自动控制的 Python 工具模块。 Pexpect 可以用来和像 ssh、ftp、pas...

Python测试开发人工智能
2018/07/25
0
0
基于Celery的并行处理工程-OpenWorker快速安装

Celery 是一个简单灵活的Python并行处理框架,但是相关的几个工程需要独自安装和配置,给小白的使用带来困难。 OpenWorker是基于Python的并行处理框架,将集成Celery、Flower、Jobtastic和R...

openthings
2015/08/10
0
4
Ansible自动化运维工具介绍

介绍 Ansible自动化运维工具,是基于Python开发的,可以实现批量系统配置,批量程序部署、批量运行命令等等。 ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansib...

程小白0302
2018/06/26
0
0
国内顶尖白帽子用Python打造渗透工具集,当时花上万购买都被拒!

前言 python是门简单易学的语言,强大的第三方库让我们在编程中事半功倍,今天我们就来谈谈python在渗透测试中的应用,让我们自己动手打造自己的渗透工具集。 一、信息搜集--py端口扫描小脚本...

诸葛青云999
2018/08/18
0
0
我们 Pikacode 公司的技术选型

“及早发布。频繁发布。听取客户的意见”(Eric S. Raymond, The Cathedral and the Bazaar)是我们Pikacode公司的主导方针。开发中的技术选型必须认真的遵循这个指导原则。 Python 快速且整洁...

oschina
2012/11/14
2.7K
20

没有更多内容

加载失败,请刷新页面

加载更多

JavaScript继承(二)——借用构造函数

JavaScript继承(一)——原型链中提出原型链继承的两个问题:一是原型的数据共享问题,二是创建子类型的实例时,不能向父类型的构造函数中传递参数。这两个问题的根源还是在于使用原型模式创...

Bob2100
53分钟前
1
0
day25:比较两个文件内容|杀进程|并发备份数据库|并发进程备份mysql库|监控全国CDN网站节点|

1、有两个文件 a.txt 和 b.txt,把 a.txt 中有的但 b.txt 中没有的行找出来,并写入列 c.txt,然后计算 c 的行数; 注释:比较两个文件两个文件不同,可以用的方法:diff md5sum grep -vf $1 $...

芬野de博客
今天
5
0
抓包工具Charles

背景介绍 Charles是一款很实用,界面很友好(至少跟fiddler比起来),功能强大的抓包神器,因为它是基于 java 开发的,所以跨平台,Mac、Linux、Windows下都是可以使用的,并且在Android和i...

Jack088
今天
5
0
徒手撸一个简单的RPC框架

徒手撸一个简单的RPC框架 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的服务就像调用本地方法一样,其中用到的知识有序列化和反序列化、动态...

不学无数的程序员
今天
2
0
Java 面试题目最全集合1000+ 大放送,能答对70%就去BATJTMD试试~

2019,相对往年我们会发现今年猎头电话少了,大部分企业年终奖缩水,加薪幅度也不如往年,选择好offer就要趁早,现在开始准备吧,刷一波Java面试题,能回答70%就去BATJTMD大胆试试~ 以下是2...

mikechen优知
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部