Qt Designer 获取cpu和内存并以图表形式展现


功能:

1.通过telnet获取top命令下某进程的cpu占用率和内存使用率

2.写入excel表格,以设备ip分工作表

3.图表展现

效果图:

代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'plot.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.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(916, 486)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout_6.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_6.setSpacing(0)
        self.verticalLayout_6.setObjectName("verticalLayout_6")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.plot_widget = QtWidgets.QWidget(self.centralwidget)
        self.plot_widget.setStyleSheet("")
        self.plot_widget.setObjectName("plot_widget")
        self.verticalLayout.addWidget(self.plot_widget)
        self.verticalLayout_6.addLayout(self.verticalLayout)
        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_7.setContentsMargins(10, -1, -1, -1)
        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setObjectName("groupBox")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox)
        self.verticalLayout_4.setContentsMargins(9, -1, -1, -1)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout.addWidget(self.label_3)
        self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit.setFrame(False)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.verticalLayout_2.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setContentsMargins(-1, 10, -1, 10)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_4 = QtWidgets.QLabel(self.groupBox)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_2.addWidget(self.label_4)
        self.timer_interval_comboBox = QtWidgets.QComboBox(self.groupBox)
        self.timer_interval_comboBox.setObjectName("timer_interval_comboBox")
        self.timer_interval_comboBox.addItem("")
        self.timer_interval_comboBox.addItem("")
        self.timer_interval_comboBox.addItem("")
        self.timer_interval_comboBox.addItem("")
        self.horizontalLayout_2.addWidget(self.timer_interval_comboBox)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem1)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_8.addItem(spacerItem2)
        self.start_draw_btn = QtWidgets.QPushButton(self.groupBox)
        self.start_draw_btn.setObjectName("start_draw_btn")
        self.horizontalLayout_8.addWidget(self.start_draw_btn)
        self.horizontalLayout_8.setStretch(0, 2)
        self.horizontalLayout_8.setStretch(1, 1)
        self.verticalLayout_2.addLayout(self.horizontalLayout_8)
        self.verticalLayout_4.addLayout(self.verticalLayout_2)
        self.horizontalLayout_7.addWidget(self.groupBox)
        spacerItem3 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_7.addItem(spacerItem3)
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_2.setObjectName("groupBox_2")
        self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox_2)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label = QtWidgets.QLabel(self.groupBox_2)
        self.label.setObjectName("label")
        self.horizontalLayout_3.addWidget(self.label)
        self.start_dateTimeEdit = QtWidgets.QDateTimeEdit(self.groupBox_2)
        self.start_dateTimeEdit.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.start_dateTimeEdit.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
        self.start_dateTimeEdit.setWrapping(False)
        self.start_dateTimeEdit.setButtonSymbols(QtWidgets.QAbstractSpinBox.UpDownArrows)
        self.start_dateTimeEdit.setKeyboardTracking(True)
        self.start_dateTimeEdit.setMaximumDate(QtCore.QDate(9999, 12, 31))
        self.start_dateTimeEdit.setCurrentSection(QtWidgets.QDateTimeEdit.YearSection)
        self.start_dateTimeEdit.setCalendarPopup(True)
        self.start_dateTimeEdit.setTimeSpec(QtCore.Qt.LocalTime)
        self.start_dateTimeEdit.setObjectName("start_dateTimeEdit")
        self.horizontalLayout_3.addWidget(self.start_dateTimeEdit)
        self.label_2 = QtWidgets.QLabel(self.groupBox_2)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_3.addWidget(self.label_2)
        self.end_dateTimeEdit = QtWidgets.QDateTimeEdit(self.groupBox_2)
        self.end_dateTimeEdit.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.end_dateTimeEdit.setTime(QtCore.QTime(23, 59, 59))
        self.end_dateTimeEdit.setMaximumDateTime(QtCore.QDateTime(QtCore.QDate(9999, 12, 31), QtCore.QTime(23, 59, 59)))
        self.end_dateTimeEdit.setCurrentSection(QtWidgets.QDateTimeEdit.YearSection)
        self.end_dateTimeEdit.setCalendarPopup(True)
        self.end_dateTimeEdit.setObjectName("end_dateTimeEdit")
        self.horizontalLayout_3.addWidget(self.end_dateTimeEdit)
        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem4)
        self.verticalLayout_3.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setContentsMargins(-1, 10, -1, 10)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.select_cbox = QtWidgets.QComboBox(self.groupBox_2)
        self.select_cbox.setObjectName("select_cbox")
        self.select_cbox.addItem("")
        self.select_cbox.addItem("")
        self.select_cbox.addItem("")
        self.horizontalLayout_4.addWidget(self.select_cbox)
        spacerItem5 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_4.addItem(spacerItem5)
        self.horizontalLayout_4.setStretch(0, 1)
        self.horizontalLayout_4.setStretch(1, 2)
        self.verticalLayout_3.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        spacerItem6 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem6)
        self.fresh_btn = QtWidgets.QPushButton(self.groupBox_2)
        self.fresh_btn.setObjectName("fresh_btn")
        self.horizontalLayout_5.addWidget(self.fresh_btn)
        self.horizontalLayout_5.setStretch(0, 2)
        self.horizontalLayout_5.setStretch(1, 1)
        self.verticalLayout_3.addLayout(self.horizontalLayout_5)
        self.verticalLayout_5.addLayout(self.verticalLayout_3)
        self.horizontalLayout_7.addWidget(self.groupBox_2)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        spacerItem7 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_6.addItem(spacerItem7)
        self.total_data_lbl = QtWidgets.QLabel(self.centralwidget)
        self.total_data_lbl.setMinimumSize(QtCore.QSize(120, 60))
        self.total_data_lbl.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.total_data_lbl.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.total_data_lbl.setText("")
        self.total_data_lbl.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
        self.total_data_lbl.setObjectName("total_data_lbl")
        self.horizontalLayout_6.addWidget(self.total_data_lbl)
        spacerItem8 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_6.addItem(spacerItem8)
        self.xy_data_lbl = QtWidgets.QLabel(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(10)
        sizePolicy.setVerticalStretch(10)
        sizePolicy.setHeightForWidth(self.xy_data_lbl.sizePolicy().hasHeightForWidth())
        self.xy_data_lbl.setSizePolicy(sizePolicy)
        self.xy_data_lbl.setMinimumSize(QtCore.QSize(120, 60))
        self.xy_data_lbl.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.xy_data_lbl.setText("")
        self.xy_data_lbl.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
        self.xy_data_lbl.setObjectName("xy_data_lbl")
        self.horizontalLayout_6.addWidget(self.xy_data_lbl)
        spacerItem9 = QtWidgets.QSpacerItem(10, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_6.addItem(spacerItem9)
        self.horizontalLayout_7.addLayout(self.horizontalLayout_6)
        self.verticalLayout_6.addLayout(self.horizontalLayout_7)
        self.verticalLayout_6.setStretch(0, 4)
        self.verticalLayout_6.setStretch(1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 916, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.groupBox.setTitle(_translate("MainWindow", "画图参数:"))
        self.label_3.setText(_translate("MainWindow", "IP:"))
        self.lineEdit.setText(_translate("MainWindow", "192.168.0.104"))
        self.label_4.setText(_translate("MainWindow", "更新间隔:"))
        self.timer_interval_comboBox.setItemText(0, _translate("MainWindow", "30分钟"))
        self.timer_interval_comboBox.setItemText(1, _translate("MainWindow", "10分钟"))
        self.timer_interval_comboBox.setItemText(2, _translate("MainWindow", "1小时"))
        self.timer_interval_comboBox.setItemText(3, _translate("MainWindow", "2小时"))
        self.start_draw_btn.setText(_translate("MainWindow", "开始画图"))
        self.groupBox_2.setTitle(_translate("MainWindow", "查询参数:"))
        self.label.setText(_translate("MainWindow", "时间范围:"))
        self.start_dateTimeEdit.setDisplayFormat(_translate("MainWindow", "yyyy/MM/dd HH:mm"))
        self.label_2.setText(_translate("MainWindow", "  -- "))
        self.end_dateTimeEdit.setDisplayFormat(_translate("MainWindow", "yyyy/MM/dd HH:mm"))
        self.select_cbox.setItemText(0, _translate("MainWindow", "全部类型"))
        self.select_cbox.setItemText(1, _translate("MainWindow", "显示CPU"))
        self.select_cbox.setItemText(2, _translate("MainWindow", "显示内存"))
        self.fresh_btn.setText(_translate("MainWindow", "刷新图表"))
import os
import sys, time
from xlutils.copy import copy
import telnetlib
import matplotlib.pyplot as plt
from threading import Thread
plt.style.use('seaborn-whitegrid')
import xlrd
import xlwt
from PyQt5.QtCore import QTimer, pyqtSignal, QDate, QTime
from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout)
from matplotlib import dates
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from plot import Ui_MainWindow
from datetime import datetime
import pandas as pd
import random

data_file = 'data.xls'
class myFigure(FigureCanvas):
    '''
    画布类,通过Figure创建画布,并且作为参数传递给父类FigureCanvas,最后添加绘图区self.axes
    '''
    # draw_signal = pyqtSignal(object, object)
    def __init__(self, parent=None):
        self.fig = Figure()
        super(myFigure, self).__init__(self.fig)
        # 在父类中激活self.fig,否则不能显示图像
        self.axes = self.fig.add_subplot(111)
        plt.rcParams['font.family'] = 'sans-serif'
        plt.rcParams['font.sans-serif'] = ['Microsoft Yahei']
        self.axes.spines['left'].set_position(('data', 0))

    def show_max_value(self, x, y, tip, color):
        max_b = 0
        cur_a = 0
        for a, b in zip(x, y):
            if int(b) > int(max_b):
                cur_a = a
                max_b = b
        if len(y) > 3:
            cur_a = dates.date2num(datetime.strptime(cur_a, "%Y/%m/%d %H:%M"))
            self.axes.text(cur_a, int(max_b) + 3, '最高%s %.0f' % (tip,int(max_b)), ha='center', va='bottom', fontsize=8,
                           color=color)

    def set_mat_func(self, x, y, y1, show_cpu, show_mem):
        '''
        用清除画布刷新的方法绘图
        :param x: x轴数据
        :param y: y轴数据
        :return:
        '''
        # 数据清洗后,数据类型变成series
        self.x = x.values
        self.y = y.values
        self.y1 = y1.values
        # 清除绘图区
        self.axes.cla()
        self.axes.set_xlabel('日期', fontsize=10)
        self.axes.set_ylabel('CPU/MEM(%)', fontsize=10)
        self.axes.grid(True, linestyle = '--', alpha = 0.5)
        self.axes.xaxis.set_major_formatter(dates.DateFormatter("%Y/%m/%d %H:%M"))
        x = [dates.date2num(datetime.strptime(self.x[i], "%Y/%m/%d %H:%M")) for i in range(len(self.x))]
        # 显示/隐藏数据判断
        if len(self.x) >= 2:
            if show_cpu == True:
                self.axes.plot(x, self.y, 'r-', linewidth=1, marker='.', mfc='w')
                self.show_max_value(self.x, self.y, "CPU", color='r')
            if show_mem == True:
                self.axes.plot(x, self.y1, 'g-', linewidth=1, marker='.', mfc='w')
                self.show_max_value(self.x, self.y1,  "MEM", color='g')
        self.axes.yaxis.set_major_locator(plt.MultipleLocator(20))
        self.axes.set_ylim(-5, 100)
        if len(self.x) <= 1:
            self.axes.set_xticks([])
        self.fig.autofmt_xdate()
        self.fig.subplots_adjust(top=0.92, bottom=0.34, right=0.979, left=0.15)
        self.fig.canvas.draw()
        self.fig.canvas.flush_events()

class TelnetClient():
    def __init__(self, ):
        self.tn = telnetlib.Telnet()

    # 此函数实现telnet登录主机
    def login_host(self, host_ip, username, password):
        try:
            # self.tn = telnetlib.Telnet(host_ip,port=23)
            self.tn.open(host_ip, port=23)
        except:
            return False
        self.tn.read_until(b'login: ', timeout=10)
        self.tn.write(username.encode('ascii') + b'\n')
        self.tn.read_until(b'Password: ', timeout=10)
        self.tn.write(password.encode('ascii') + b'\n')
        time.sleep(2)
        # read_very_eager()获取到的是的是上次获取之后本次获取之前的所有输出
        command_result = self.tn.read_very_eager().decode('ascii')
        if 'Login incorrect' not in command_result:
            # print(u'%s 登录成功' % host_ip)
            return True
        else:
            print(u'%s 登录失败,用户名或密码错误' % host_ip)
            return False

    # 此函数实现执行传过来的命令,并输出其执行结果
    def execute_some_command(self, command, waittime):
        self.tn.write(command.encode('ascii') + b'\n')
        time.sleep(waittime)

        # 获取命令结果
        command_result = self.tn.read_very_eager().decode('ascii')
        ##        print(u'命令执行结果:\n%s' % command_result)
        return command_result

    # 退出telnet
    def logout_host(self):
        self.tn.write(b"exit\n")


class UI(QMainWindow, Ui_MainWindow):
    draw_signal = pyqtSignal(object, object, object, object, object)
    modify_window_title_signal = pyqtSignal()
    show_data_signal = pyqtSignal()
    fresh_datetime_signal = pyqtSignal()
    def __init__(self):
        super(UI, self).__init__()
        self.setupUi(self)
        self.resize(1000, 600)
        self.fresh_btn.clicked.connect(lambda : Thread(target=self.on_fresh).start())
        self.canvas = myFigure(self.plot_widget)
        self.draw_signal.connect(self.canvas.set_mat_func)
        self.modify_window_title_signal.connect(self.set_window_title)
        self.canvas.mpl_connect('motion_notify_event', self.on_motion_notify_event)
        self.start_draw_btn.clicked.connect(lambda :Thread(target=self.start_draw).start())
        self.start_draw_btn.clicked.connect(self.timer_start)
        self.start_draw_btn.clicked.connect(self.timer_stop)
        self.show_data_signal.connect(self.show_data)
        self.fresh_datetime_signal.connect(self.fresh_datetime)

        self.x = pd.Series([],dtype=object)
        self.y = pd.Series([], dtype=float)
        self.y1 = pd.Series([], dtype=float)
        self.layout = QVBoxLayout(self.plot_widget)
        self.layout.addWidget(self.canvas)
        self.total_row = 0
        self.show_cpu = True
        self.show_mem = True
        self.init_ui()
        self.timer = QTimer()
        self.timer.timeout.connect(self.set_data)

    def timer_start(self):
        if self.timer_flag == True:
            self.timer_interval_func()
            self.timer.start(1000 * 60 * int(self.timer_interval_value))

    def timer_stop(self):
        if self.timer_flag == False:
            self.timer.stop()

    def start_draw(self):
        self.ip = self.lineEdit.text().strip()
        if len(self.ip) == 0:
            return
        self.sheet_name = self.ip
        if self.start_draw_btn.text().strip() == '开始画图':
            self.timer_flag = True
            self.lineEdit.setEnabled(False)
            self.timer_interval_comboBox.setEnabled(False)
            self.start_draw_btn.setText('结束画图')
            self.set_data()
        else:
            self.timer_flag = False
            self.start_draw_btn.setText('开始画图')
            self.lineEdit.setEnabled(True)
            self.timer_interval_comboBox.setEnabled(True)


    def fresh_datetime(self):
        self.start_dateTimeEdit.setDate(QDate.currentDate())
        self.start_dateTimeEdit.setTime(QTime(00, 00, 00))
        self.end_dateTimeEdit.setDate(QDate.currentDate())
        self.end_dateTimeEdit.setTime(QTime(23, 59, 59))

    def set_window_title(self):
        self.ip = self.lineEdit.text()
        window_title = 'CPU/内存监控'
        if len(self.ip) != 0:
            window_title = window_title + ' - ' + self.ip
        self.setWindowTitle(window_title)

    def timer_interval_func(self):
        timer_interval = self.timer_interval_comboBox.currentText()
        dict_time = {"2分钟": 2, "5分钟": 5, "10分钟": 10, "30分钟": 30, "1小时": 60, "2小时": 120}
        self.timer_interval_value = dict_time[timer_interval]

    def init_ui(self):
        self.modify_window_title_signal.emit()
        self.fresh_datetime_signal.emit()
        self.xy_data_lbl.setText('数据坐标:\nX:\nY:\n')
        self.draw_signal.emit(self.x, self.y, self.y1, self.show_cpu, self.show_mem)
        self.canvas.fig.suptitle('CPU/内存使用率实时趋势', fontsize=10)
        self.show_data_signal.emit()

    def show_data(self):
        self.date_range_start = ''
        self.date_range_end = ''
        self.query_date()
        if len(self.x) <= 1:
            show_data_num = 0
            self.total_row = 0
            self.date_range_start = 0
            self.date_range_end = 0
        else:
            show_data_num = len(self.x)
            self.total_row -= 1
        self.total_data_lbl.setText('显示数据:%s\n总数据:%s\n开始日期:%s\n结束日期:%s' % (show_data_num, self.total_row,
                                                                   self.date_range_start, self.date_range_end))

    def on_motion_notify_event(self, event):
        '''
        功能:鼠标移动显示数据坐标轴上的x,y值
        :param event:
        :return:
        '''
        if event.xdata == None or event.ydata == None:
            return
        x = dates.num2date(event.xdata).strftime("%Y/%m/%d %H:%M")
        y = event.ydata.astype(int)
        x_values = self.x.values
        y_values = self.y.values
        y1_values = self.y1.values
        str_x = [str(x_values[i]) for i in range(len(x_values))]
        int_y = [y_values[j].astype(int) for j in range(len(y_values))]
        int_y1 = [y1_values[j].astype(int) for j in range(len(y1_values))]
        if x in str_x:
            if y in int_y:
                self.xy_data_lbl.setText('数据坐标:\nX:%s\nY:%s\n' %(x, y))
            elif y in int_y1:
                self.xy_data_lbl.setText('数据坐标:\nX:%s\nY:%s\n' % (x, y))
            else:
                self.xy_data_lbl.setText('数据坐标:\nX:\nY:\n')
        else:
            self.xy_data_lbl.setText('数据坐标:\nX:\nY:\n')

    def on_fresh(self):
        self.modify_window_title_signal.emit()
        self.ip = self.lineEdit.text().strip()
        if len(self.ip) == 0:
            return
        self.sheet_name = self.ip
        if not os.path.exists(data_file):
            return
        readbook = xlrd.open_workbook(data_file)
        # 判断工作表是否存在
        if not self.sheet_name in readbook.sheet_names():
            return
        self.get_data()
        self.draw_signal.emit(self.x, self.y, self.y1, self.show_cpu, self.show_mem)

    def write_content(self, sheet):
        sheet.write(0, 0, '日期')
        sheet.write(0, 1, 'cpu使用率')
        sheet.write(0, 2, '内存使用率')

    def create_sheet(self):
        if not os.path.exists(data_file):
            writebook = xlwt.Workbook(data_file)
            sheet = writebook.add_sheet(self.sheet_name)
            self.write_content(sheet)
            writebook.save(data_file)
        else:
            readbook = xlrd.open_workbook(data_file)
            # 判断工作表是否存在
            if not self.sheet_name in readbook.sheet_names():
                new_readbook = copy(readbook)
                sheet = new_readbook.add_sheet(self.sheet_name)
                self.write_content(sheet)
                new_readbook.save(data_file)

    def get_telnet_data(self, ip):
        '''
            函数功能:获取ipc设备剩余系统内存,free -m
        '''
        username = '用户名'
        password = '密码'
        mem_command = "free -m | grep  Mem: | grep -v grep | awk -F ' ' '{print $3/$2  FS}'"
        command = "top -n 8 | grep  \进程名 | grep -v grep | awk -F ' ' '{print $7 FS}'"
        self.telnet_client = TelnetClient()

        try:
            if self.telnet_client.login_host(str(ip), username, password):
                # print(u'\ntelnet成功,正在操作...')
                command_result = self.telnet_client.execute_some_command(command, 60)
                strcommand_result = str(command_result.encode('utf-8'))
                cmdstr = strcommand_result.split('\\r\\n')[2:-1]
                cmdstr = ('\n'.join(cmdstr)).strip()
                # print(u'系统占用CPU:{}'.format(cmdstr))
                mem_result = self.telnet_client.execute_some_command(mem_command, 10)
                self.telnet_client.logout_host()
                # print(u'telnet完成')
                return cmdstr, mem_result
            else:
                print(u'\ntelnet失败 ')
                return
        except:
            return

    def get_file_status(self):
        if not os.path.exists(data_file):
            return
        try:
            readbook = xlrd.open_workbook(data_file)
            # 判断工作表是否存在
            if not self.sheet_name in readbook.sheet_names():
                return
            row = readbook.sheet_by_name(self.sheet_name).nrows
            self.total_row = row
            return 1
        except:
            pass

    def write_data(self):
        try:
            self.create_sheet()
            readbook = xlrd.open_workbook(data_file)
            row = readbook.sheet_by_name(self.sheet_name).nrows
            self.total_row = row
            new_excel = copy(readbook)
            sheet = new_excel.get_sheet(self.sheet_name)
        except:
            print('文件访问失败')
            return 1
        data = ''
        data_mem = ''
        try:
            res, res_mem = self.get_telnet_data(self.ip)
            data_mem = res_mem.split('\r\n')[1][2:4]
            data_list = []
            for i in res.split():
                i = i.strip()
                if '%' in i:
                    i = i[:-1]
                data_list.append(float(i))
            data = max(data_list)
        except Exception as e:
            print('get telnet data failed, cpu: %s, mem: %s' % (data,data_mem))
            print(e)
            return 1
        # 为测试,造数据
        time_result = datetime.now().strftime("%Y/%m/%d %H:%M")
        # data = random.randint(0, 70)
        # data_mem = random.randint(0, 80)
        sheet.write(row, 0, time_result)
        sheet.write(row, 1, data)
        sheet.write(row, 2, data_mem)
        new_excel.save(data_file)

    def query_date(self):
        if self.get_file_status() != 1:
            return
        df1 = pd.read_excel(data_file, sheet_name=self.sheet_name)
        df1 = df1.sort_values(by='日期', ascending=True)
        df1 = df1.set_index('日期', drop=True)
        date_range = df1.index
        if len(date_range) >= 2:
            self.date_range_start = date_range[0][:10]
            self.date_range_end = date_range[len(date_range) - 1][:10]

    def get_data(self):
        self.get_file_status()
        start_time = self.start_dateTimeEdit.dateTime().toString("yyyy/MM/dd hh:mm")
        end_time = self.end_dateTimeEdit.dateTime().toString("yyyy/MM/dd hh:mm")
        # 判断开始时间小于结束时间
        d_start_time = datetime.strptime(start_time,"%Y/%m/%d %H:%M")
        d_end_time = datetime.strptime(end_time,"%Y/%m/%d %H:%M")
        if d_start_time >= d_end_time:
            self.fresh_datetime_signal.emit()
            start_time = self.start_dateTimeEdit.dateTime().toString("yyyy/MM/dd hh:mm")
            end_time = self.end_dateTimeEdit.dateTime().toString("yyyy/MM/dd hh:mm")
        df = pd.read_excel(data_file, sheet_name=self.sheet_name)
        # 数据清洗,缺失值的行要作删除处理,整行为空删除, 日期重复删除,重置索引
        df.dropna(inplace=True)
        df = df.drop_duplicates(['日期'], keep='last').reset_index(drop=True)
        df = df.sort_values(by='日期', ascending=True)
        # 设置日期为索引, 然后获取某个区间数据
        df = df.set_index('日期', drop=True)
        df = df[start_time:end_time]
        self.x = df.index
        self.cur_text = self.select_cbox.currentText()
        self.show_cpu = True
        self.show_mem = True
        if self.cur_text == '显示CPU':
            self.show_cpu = True
            self.show_mem = False
        elif self.cur_text == '显示内存':
            self.show_mem = True
            self.show_cpu = False

        self.y = df['cpu使用率']
        self.y1 = df['内存使用率']
        self.show_data_signal.emit()

    def get_cpu(self):
        if self.write_data() == 1:
            return
        self.get_data()

    def fresh_date_range(self):
        # 功能:为了在新的一天自动
        start_time = datetime.strptime(str(datetime.now().date()) + '0:00', '%Y-%m-%d%H:%M')
        end_time = datetime.strptime(str(datetime.now().date()) + '3:00', '%Y-%m-%d%H:%M')
        now_time = datetime.now()
        # 判断当前时间是否在范围时间内
        if start_time < now_time < end_time:
            self.fresh_datetime_signal.emit()
            self.on_fresh()

    def set_data(self):
        self.modify_window_title_signal.emit()
        self.fresh_date_range()
        self.create_sheet()
        readbook = xlrd.open_workbook(data_file)
        row = readbook.sheet_by_name(self.sheet_name).nrows
        self.total_row = row
        self.get_cpu()
        self.draw_signal.emit(self.x, self.y, self.y1, self.show_cpu, self.show_mem)

if __name__ == '__main__':
    app = QApplication([])
    server = UI()
    server.show()
    sys.exit(app.exec_())