pyqt5开发linux远程下载文件工具

简介: pyqt5开发linux远程下载文件工具

1、主文件download_tools.py

importsysfrommethodimporthome_uifromPyQt5.QtWidgetsimportQApplication,QMainWindowif__name__=='__main__':
app=QApplication(sys.argv)
# 新建一个主窗口mainWindow=QMainWindow()
# 将创建的py绘制窗口中的UI_MainWindow类赋给uiui=home_ui.Ui_MainWindow()
# 调用类中的setupUi方法,参数为新建的主窗口ui.setupUi(mainWindow)
# 显示该主窗口mainWindow.show()
# 保持停留sys.exit(app.exec_())

2、工具页面文件home_ui.py

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'home_ui.ui'## Created by: PyQt5 UI code generator 5.15.4## WARNING: Any manual changes made to this file will be lost when pyuic5 is# run again.  Do not edit this file unless you know what you are doing.frommethod.ssh_methodimport*fromPyQt5importQtCore, QtGui, QtWidgetsfromPyQt5.QtWidgetsimportQMainWindow, QApplication, QPushButtonfromPyQt5.QtCoreimportQCoreApplication,QThreadfromPyQt5.QtWidgetsimport*importos,threadingfrommethod.ThreadClassimport*linux=Linux_Cmd(ip='192.168.253.131',port=22,username='root',password="123456")
classUi_MainWindow(object):
defsetupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(860, 580)
self.centralwidget=QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout=QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
spacerItem=QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem, 2, 0, 1, 1)
self.horizontalLayout=QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
spacerItem1=QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.label=QtWidgets.QLabel(self.centralwidget)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
"""短输入框"""self.lineEdit=QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout.addWidget(self.lineEdit)
"""下载功能按钮"""self.pushButton=QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.pushButton.clicked.connect(self.download_method)
spacerItem2=QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem2)
self.gridLayout.addLayout(self.horizontalLayout, 1, 1, 1, 1)
spacerItem3=QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem3, 2, 3, 1, 1)
"""文本输入框"""self.textEdit=QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setObjectName("textEdit")
self.gridLayout.addWidget(self.textEdit, 2, 1, 1, 1)
#self.textEdit.setFocusPolicy(QtCore.Qt.NoFocus)"""打开目录按钮"""self.pathButton=QtWidgets.QPushButton(self.centralwidget)
self.pathButton.setObjectName("pathButton")
self.pathButton.clicked.connect(self.open_path)
self.gridLayout.addWidget(self.pathButton, 1, 0, 1, 1)
"""关闭窗口按钮"""self.closeButton=QtWidgets.QPushButton(self.centralwidget)
self.closeButton.setObjectName("closeButton")
self.closeButton.clicked.connect(QCoreApplication.instance().quit)
self.gridLayout.addWidget(self.closeButton, 1, 3, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar=QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
defdownload_method(self):
value=self.lineEdit.text()
self.vlues_input=value.replace(" ","").replace("\n","")
print(value)
task=MyThread(linux.run,args=(self.vlues_input,))
task.start()
check=task.get_result()
self.messageDialog(check)
# 警告框defmessageDialog(self,check):
ifcheck==False:
msg_box=QMessageBox(QMessageBox.Warning, '警告', '你所输入的文件不存在')
msg_box.exec_()
elifcheck==True:
msg_box=QMessageBox(QMessageBox.Information, '提示', '下载完成')
msg_box.exec_()
defopen_path(self):
ifnotos.path.exists("./download_file"):  # os模块判断并创建os.mkdir("./download_file")
os.system("start explorer "+os.path.abspath(os.path.join(os.getcwd(), "./download_file")))
else:
os.system("start explorer "+os.path.abspath(os.path.join(os.getcwd(), "./download_file")))
defretranslateUi(self, MainWindow):
_translate=QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "版本下载工具"))
self.label.setText(_translate("MainWindow", "输入文件名"))
self.pushButton.setText(_translate("MainWindow", "下载"))
self.textEdit.setHtml(_translate("MainWindow", "读取到的文件名:"))
get_status=linux.get_info()
ifget_status=="无数据":
self.textEdit.append(get_status)
elifget_status=="数据读取失败请检查连接情况":
self.textEdit.append(get_status)
self.pushButton.setEnabled(False)
msg_box=QMessageBox(QMessageBox.Critical, 'error', '连接到服务器错误\n请检查环境是否正常')
msg_box.exec_()
else:
foriinget_status:
self.textEdit.append(i+"\n")
self.pathButton.setText(_translate("MainWindow", "打开目录"))
self.closeButton.setText(_translate("MainWindow", "关闭"))

3、多线程文件ThreadClass.py

# coding:utf-8importthreading, timeclassMyThread(threading.Thread):
def__init__(self, func, args=()):
super(MyThread, self).__init__()
self.func=funcself.args=argsdefrun(self):
self.result=self.func(*self.args)
defget_result(self):
threading.Thread.join(self) # 等待线程执行完毕try:
returnself.resultexceptException:
returnNone

4、公用函数文件ssh_method.py

#coding:utf-8importparamiko,osimportreip='10.20.12.103'port=22username='root'password="!QAZ2wsx#EDC"url="/home/version-management/"file_version="test_version.zip"classLinux_Cmd(object):
def__init__(self,ip,port,username,password):
self.ip=ipself.port=portself.username=usernameself.password=passworddeflinxu_ssh(self,cmd):
# 创建SSH对象client=paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器print(self.ip, self.port, self.username, self.password)
try:
client.connect(self.ip,self.port,self.username,self.password, compress=True,timeout=1)
# 执行linux命令cmd_info=client.exec_command(cmd)[1]
returncmd_infoexcept:
print("连接超时")
defremote_scp(self,remote_path, local_path):
client=paramiko.Transport((self.ip, self.port))
client.connect(username=self.username, password=self.password)
sftp=paramiko.SFTPClient.from_transport(client)
src=remote_pathdes=local_pathsftp.get(src, des)
client.close()
defrun(self,file_name):
cmd=Linux_Cmd(ip=ip, port=port, username=username, password=password)
stdout=cmd.linxu_ssh('ls '+url+file_name)
txt_list= []
try:
lines=stdout.readlines()
print(lines)
foriinlines:
txt_list.append(i.rstrip("\n"))
print(txt_list)
iffile_versionnotintxt_list:
returnFalseelse:
#dll_input = input()ifnotos.path.exists("./download_file/"):  # os模块判断并创建os.mkdir("./download_file")
cmd.remote_scp(remote_path=url+file_name+"/"+file_version,
local_path="./download_file/"+"/"+file_version)
returnTrueelse:
cmd.remote_scp(remote_path=url+file_name+"/"+file_version,
local_path="./download_file/"+"/"+file_version)
returnTrueexcept:
print("未获取到数据")
returnFalsedefget_info(self):
try:
cmd=Linux_Cmd(ip=ip, port=port, username=username, password=password)
stdout=cmd.linxu_ssh('ls '+url)
stdout_num=stdout.readlines()
print(len(stdout_num))
iflen(stdout_num) ==0:
print("无数据")
return"无数据"else:
txt_list= []
lines=stdout_numforiinlines:
txt_list.append(i.rstrip("\n\n"))
returntxt_listexcept:
return"数据读取失败请检查连接情况"#if __name__ == '__main__':#    print(get_info())

5、QT页面UI布局

<?xmlversion="1.0" encoding="UTF-8"?><uiversion="4.0"><class>MainWindow</class><widgetclass="QMainWindow"name="MainWindow"><propertyname="geometry"><rect><x>0</x><y>0</y><width>640</width><height>480</height></rect></property><propertyname="windowTitle"><string>MainWindow</string></property><widgetclass="QWidget"name="centralwidget"><layoutclass="QGridLayout"name="gridLayout"><itemrow="2"column="0"><spacername="horizontalSpacer_3"><propertyname="orientation"><enum>Qt::Horizontal</enum></property><propertyname="sizeHint"stdset="0"><size><width>40</width><height>20</height></size></property></spacer></item><itemrow="1"column="1"><layoutclass="QHBoxLayout"name="horizontalLayout"><item><spacername="horizontalSpacer"><propertyname="orientation"><enum>Qt::Horizontal</enum></property><propertyname="sizeHint"stdset="0"><size><width>40</width><height>20</height></size></property></spacer></item><item><widgetclass="QLabel"name="label"><propertyname="text"><string>输入文件名</string></property></widget></item><item><widgetclass="QLineEdit"name="lineEdit"/></item><item><widgetclass="QPushButton"name="pushButton"><propertyname="text"><string>下载</string></property></widget></item><item><spacername="horizontalSpacer_2"><propertyname="orientation"><enum>Qt::Horizontal</enum></property><propertyname="sizeHint"stdset="0"><size><width>40</width><height>20</height></size></property></spacer></item></layout></item><itemrow="2"column="3"><spacername="horizontalSpacer_4"><propertyname="orientation"><enum>Qt::Horizontal</enum></property><propertyname="sizeHint"stdset="0"><size><width>40</width><height>20</height></size></property></spacer></item><itemrow="2"column="1"><widgetclass="QTextEdit"name="textEdit"><propertyname="html"><string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot;&quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:12pt;&quot;&gt;读取到的文件名:&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string></property></widget></item><itemrow="1"column="0"><widgetclass="QPushButton"name="pushButton_2"><propertyname="text"><string>打开目录</string></property></widget></item><itemrow="1"column="3"><widgetclass="QPushButton"name="pushButton_3"><propertyname="text"><string>关闭</string></property></widget></item></layout></widget><widgetclass="QStatusBar"name="statusbar"/></widget><resources/><connections/></ui>

6、介绍:这里是根据四个文件来开发的gui界面主路径为download_tools\method,主页面在第一路径下,运行只需要运行download_tools.py文件即可打开页面

目录
相关文章
|
21天前
|
Linux 数据安全/隐私保护
适用于 Linux 的最佳命令行下载加速器
适用于 Linux 的最佳命令行下载加速器
40 3
|
13天前
|
人工智能 Java 关系型数据库
Red Hat Enterprise Linux 9.5 发布下载,新增功能亮点概述
Red Hat Enterprise Linux 9.5 发布下载,新增功能亮点概述
51 4
Red Hat Enterprise Linux 9.5 发布下载,新增功能亮点概述
|
17天前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
39 5
|
17天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
35 6
|
17天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
50 6
|
18天前
|
监控 Linux Perl
Linux 命令小技巧:显示文件指定行的内容
在 Linux 系统中,处理文本文件是一项常见任务。本文介绍了如何使用 head、tail、sed 和 awk 等命令快速显示文件中的指定行内容,帮助你高效处理文本文件。通过实际应用场景和案例分析,展示了这些命令在代码审查、日志分析和文本处理中的具体用途。同时,还提供了注意事项和技巧,帮助你更好地掌握这些命令。
33 4
|
23天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
43 2
|
22天前
|
缓存 监控 Linux
|
26天前
|
Linux Shell 数据库
文件查找是Linux用户日常工作的重要技能介绍了几种不常见的文件查找方法
文件查找是Linux用户日常工作的重要技能。本文介绍了几种不常见的文件查找方法,包括使用`find`和`column`组合、`locate`和`mlocate`快速查找、编写Shell脚本、使用现代工具`fd`、结合`grep`搜索文件内容,以及图形界面工具如`Gnome Search Tool`和`Albert`。这些方法能显著提升文件查找的效率和准确性。
42 2
|
27天前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
84 1