服务器可以pyqt显示吗,用pyqt+socket实现远程操作服务器的一个例子,PyQtsocket,方法,示例...
@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府
这篇文章主要介绍了PyQt+socket实现远程操作服务器的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
来需求了。。干活啦。。
需求内容
部分时候由于缓存刷新、验证码显示不出来或者浏览器打不开或者打开速度很慢等原因,导致部分测试同事不想使用浏览器登录服务器执行命令。 期望有小工具可以替代登录浏览器的操作,直接发送指令到服务器执行并将执行结果返回。
需求设计
1、开发界面,方便用户输入IP、用户名、密码以及执行的命令。
2、IP、用户名、密码和命令输入提供默认值。特别是用户名和密码,对于测试服务器来说,通常都是固定的。
3、IP、命令行输入框可以自动补全用户输入。自动补全常用IP、命令行可以提高操作效率。
4、可以自动保存用户执行成功的IP、命令行。用于完善自动补全命令(本文代码未实现)。
需求设计
1、使用Qt Designer实现界面开发。开发后界面参考如下:
2、使用socket程序登录服务器并执行命令,并将结果显示在界面文本框中。
代码实现(程序可以直接复制运行)
1、使用Qt Designer实现界面开发。拖动4个label+4个输入框+1个按钮+1个textBrowser到主界面。开发后界面同需求设计中的截图。
2、使用pyuic5 -o commandtools.py commandtools.ui指令将.ui文件转换成.py文件。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'commandTools.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(483, 347)
self.ip_label = QtWidgets.QLabel(Form)
self.ip_label.setGeometry(QtCore.QRect(30, 20, 16, 16))
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.ip_label.setFont(font)
self.ip_label.setObjectName("ip_label")
self.ip_lineEdit = QtWidgets.QLineEdit(Form)
self.ip_lineEdit.setGeometry(QtCore.QRect(50, 20, 101, 20))
self.ip_lineEdit.setObjectName("ip_lineEdit")
self.username_label = QtWidgets.QLabel(Form)
self.username_label.setGeometry(QtCore.QRect(160, 20, 61, 16))
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.username_label.setFont(font)
self.username_label.setObjectName("username_label")
self.username_lineEdit = QtWidgets.QLineEdit(Form)
self.username_lineEdit.setGeometry(QtCore.QRect(220, 20, 71, 20))
self.username_lineEdit.setObjectName("username_lineEdit")
self.password_label = QtWidgets.QLabel(Form)
self.password_label.setGeometry(QtCore.QRect(300, 20, 61, 16))
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.password_label.setFont(font)
self.password_label.setObjectName("password_label")
self.password_lineEdit = QtWidgets.QLineEdit(Form)
self.password_lineEdit.setGeometry(QtCore.QRect(360, 20, 80, 20))
self.password_lineEdit.setObjectName("password_lineEdit")
self.command_label = QtWidgets.QLabel(Form)
self.command_label.setGeometry(QtCore.QRect(30, 70, 51, 16))
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.command_label.setFont(font)
self.command_label.setObjectName("command_label")
self.command_lineEdit = QtWidgets.QLineEdit(Form)
self.command_lineEdit.setGeometry(QtCore.QRect(90, 70, 251, 20))
self.command_lineEdit.setObjectName("command_lineEdit")
self.result_textBrowser = QtWidgets.QTextBrowser(Form)
self.result_textBrowser.setGeometry(QtCore.QRect(30, 120, 410, 201))
self.result_textBrowser.setObjectName("result_textBrowser")
self.run_Button = QtWidgets.QPushButton(Form)
self.run_Button.setGeometry(QtCore.QRect(360, 70, 80, 23))
self.run_Button.setObjectName("run_Button")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "cmdTool"))
self.ip_label.setText(_translate("Form", "IP"))
self.ip_lineEdit.setText(_translate("Form", "127.0.0.1"))
self.username_label.setText(_translate("Form", "username"))
self.username_lineEdit.setText(_translate("Form", "admin"))
self.password_label.setText(_translate("Form", "password"))
self.password_lineEdit.setText(_translate("Form", "Winovs12!"))
self.command_label.setText(_translate("Form", "Command"))
self.command_lineEdit.setText(_translate("Form", "LST LOG"))
self.run_Button.setText(_translate("Form", "Run"))
3、实现主程序callcommand.py调用(业务与逻辑分离)。代码如下:
# -*- coding: utf-8 -*-
import sys
import time
import socket
from PyQt5.QtWidgets import QApplication, QMainWindow,QCompleter
from PyQt5.QtCore import Qt,QThread,pyqtSignal
from commandTools import Ui_Form
class MyMainForm(QMainWindow, Ui_Form):
def __init__(self, parent=None):
"""
构造函数
"""
super(MyMainForm, self).__init__(parent)
self.setupUi(self)
self.run_Button.clicked.connect(self.execte_command)
self.ip_init_lst = ['121.1.1.1', '192.168.1.1', '172.16.1.1']
self.init_lineedit(self.ip_lineEdit,self.ip_init_lst)
self.cmd_init_lst = ['LST LOG', 'LST PARA','MOD PARA']
self.init_lineedit(self.command_lineEdit,self.cmd_init_lst)
def init_lineedit(self, lineedit, item_list):
"""
用户初始化控件自动补全功能
"""
# 增加自动补全
self.completer = QCompleter(item_list)
# 设置匹配模式 有三种: Qt.MatchStartsWith 开头匹配(默认) Qt.MatchContains 内容匹配 Qt.MatchEndsWith 结尾匹配
self.completer.setFilterMode(Qt.MatchContains)
# 设置补全模式 有三种: QCompleter.PopupCompletion(默认) QCompleter.InlineCompletion QCompleter.UnfilteredPopupCompletion
self.completer.setCompletionMode(QCompleter.PopupCompletion)
# 给lineedit设置补全器
lineedit.setCompleter(self.completer)
def execte_command(self):
"""
登录服务器,并执行命令
"""
ip, username, password, command = self.get_input_para()
print(type(ip))
sockethandle = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sockethandle.connect((str(ip), 6000))
send_cmd = "username: %s, admin: %s, command: %s" % (username, password, command)
print(send_cmd)
sockethandle.sendall(send_cmd.encode('utf-8'))
time.sleep(0.5)
recdata = sockethandle.recv(65535)
tran_recdata = recdata.decode('utf-8')
self.result_textBrowser.setText(tran_recdata)
def get_input_para(self):
"""
获取用户界面输入
"""
ip = self.ip_lineEdit.text()
username = self.username_lineEdit.text()
password = self.password_lineEdit.text()
command = self.command_lineEdit.text()
return ip, username, password, command
if __name__ == "__main__":
app = QApplication(sys.argv)
myWin = MyMainForm()
myWin.show()
sys.exit(app.exec_())
4、使用pyinstaller转换成可执行的.exe文件。命令: pyinstaller -F callcommand.py -w
执行成功,生成的文件在d:\temp\dist\dist\callcommand.exe
5、运行callcommand.exe,点击run运行
关键代码
1、输入框自动补全功能函数。同样适用于下拉框控件。
def init_lineedit(self, lineedit, item_list):
"""
用户初始化控件自动补全功能
"""
# 增加自动补全
self.completer = QCompleter(item_list)
# 设置匹配模式 有三种: Qt.MatchStartsWith 开头匹配(默认) Qt.MatchContains 内容匹配 Qt.MatchEndsWith 结尾匹配
self.completer.setFilterMode(Qt.MatchContains)
# 设置补全模式 有三种: QCompleter.PopupCompletion(默认) QCompleter.InlineCompletion QCompleter.UnfilteredPopupCompletion
self.completer.setCompletionMode(QCompleter.PopupCompletion)
# 给lineedit设置补全器
lineedit.setCompleter(self.completer)
2、socket中sendall函数要将命令使用utf-8编码,否则会导致界面卡住:
sockethandle.sendall(send_cmd.encode('utf-8'))
3、需要将命令返回的内容解码再写入文本框,否则会导致界面卡住。
recdata = sockethandle.recv(65535)
tran_recdata = recdata.decode('utf-8')
self.result_textBrowser.setText(tran_recdata)
附录
由于本地没有服务器用于调试程序。所以使用socket搭建1个建议服务器。服务器功能实现将接收的命令原样返回。就是接收什么命令就给客户端返回什么内容。服务器IP为本地IP127.0.0.1,绑定端口为6000。代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import sys
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("socket create success!")
try:
s.bind(('127.0.0.1',6000))
except socket.error as msg:
print(msg)
sys.exit(1)
s.listen(10)
while True:
conn, addr = s.accept()
print("success")
data = conn.recv(65535)
conn.sendall(data.decode('utf-8'))
conn.close()
s.close()
启动服务器:
简陋的有点过分,但是满足调试需求了。。。
小结
这个python+scoket需求实现的远程登录服务器执行命令只是把基本功能实现了。中间遇到的界面无响应甚至退出的问题(就是socket发送和接收内容编解码导致的)。。但是还有很多地方需要优化,比如对入参的判断并输出到文本框提示、对连接服务器结果的判断,还有界面的美化等内容。
非常感谢你的阅读
大学的时候选择了自学python,工作了发现吃了计算机基础不好的亏,学历不行这是没办法的事,只能后天弥补,于是在编码之外开启了自己的逆袭之路,不断的学习python核心知识,深入的研习计算机基础知识,整理好了,我放在我们的微信公众号《程序员学府》,如果你也不甘平庸,那就与我一起在编码之外,不断成长吧!
其实这里不仅有技术,更有那些技术之外的东西,比如,如何做一个精致的程序员,而不是“屌丝”,程序员本身就是高贵的一种存在啊,难道不是吗?
[点击加入]
想做你自己想成为高尚人,加油!
服务器可以pyqt显示吗,用pyqt+socket实现远程操作服务器的一个例子,PyQtsocket,方法,示例...相关推荐
- ESP8266配网并将IP显示至oled液晶屏 ESP8266远程连接服务器控制灯或继电器
智能车与机器人技术交流平台 概述 可能已经有人很熟练的编写ESP8266程序,但是因为我学习运用的时间也就一周左右,踩了好多坑,所以不喜就不要看勿喷.文章仅此分享交流一些经验,供此参考. 主要做的工作 ...
- 连接服务器显示出现内部错误怎么解决方案,远程连接服务器提示“出现了内部错误”解决方法锐讯网络罗海清...
远程连接服务器提示"出现了内部错误"解决方法: 解决方法: Win+R键 打开DOS窗口 输入"ncpa.cpl"并敲击回车 紧接着会看到"本地连接& ...
- 服务器里的文件删了能恢复吗,远程把服务器文件删了怎么恢复
远程把服务器文件删了怎么恢复 内容精选 换一换 按需购买的两台同类型弹性云服务器(操作系统类型相同,如Windows和Windows,Linux和Linux),关机卸载系统盘后,重新挂载至对方弹性云服 ...
- 怎么用git将本地代码上传到远程服务器_TortoiseGit将本地git仓库上传到远程git服务器方法...
以前为了图省事,通过TortoiseGit创建本地仓库(与git服务器无连接),对于个人使用确实比较方便,commit,revert,diff之类的功能都能够使用,并且速度也很快的.代码开发到一定阶段 ...
- python将源代码转换成在html可显示的格式,Python实现将HTML转换成doc格式文件的方法示例...
Python实现将HTML转换成doc格式文件的方法示例 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: Python实现将HTML转换成doc格式文件的方法示例. ...
- 远程服务器怎么能显示电脑u盘,怎样在远程服务器上看到u盘
怎样在远程服务器上看到u盘 内容精选 换一换 将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式.本节为您介绍本地Windows计算机通过远程桌面连接,上传文件至Windows云 ...
- 战地3服务器网络不显示,战地3今天更新了?发现服务器进不去了,贴个官方消息。...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 -- Balance and Gameplay Adjustments (PC) • Fixed a problem with high speed mo ...
- 我的世界服务器为什么一直显示游戏运行中,我的世界网易版进不去解决方法 MC网易电脑端进不去原因...
虽然网易版的国服我的世界是免费的,但是还是有些问题值得吐槽,就是会出现游戏登录不上去,本期为大家带来的就是我的世界网易版进不去解决方法及MC网易电脑端进不去原因! 我的世界网易版进不去解决方法 MC网 ...
- 使用 IPMI 远程操作服务器
需要注意的一点是,每操作一次,就需要重新下载一次launch.jnlp 而且操作的同时要保证浏览器的网页一直处于打开状态 1.输入https://192.168.19.95/ 用户名和密码都是ADMI ...
最新文章
- Android Activity的生命周期、意图(Intent)
- 剑指offer之先序非递归打印二叉树
- HDOJ(HDU) 1994 利息计算(简单题目)
- 使用pyinstaller把pyton文件打包成exe文件
- 掌握 git reset 使用
- IntelliJ中可能的东西在Eclipse中是不可能的?
- cognos ibm 收购_IBM Cognos与Linux上的Sterling Selling and Fulfillment Suite集成
- 谷歌浏览器书签丢失,恢复工具
- Litestar 4D:道路照明
- 无人驾驶入门1:无人驾驶概览
- 安装旧版本gcc的简便方法,软件包管理命令update-alternatives使用
- vue图片裁剪:使用vue-cropper做图片裁剪
- ios游戏和android,20款最受好评的iOS和Android游戏
- ospf路由器连接物理网络的方式 以及ospf与IGRP对比(补充)
- 将windows里的内容直接复制粘贴到ubuntu,提高效率
- 视频监控ai分析系统 yolo
- narak 靶机实验实战演练
- 最新版FusionCharts2D面积图
- 如何删除mysql数据库的重复数据
- 数据分析课后作业--信用卡客户风险评价(代码)