PyQt5网速监控器

2017-08-17  本文已影响0人  skyloveraining

Qt图形界面可以使用QtDesigner进行创建,不过本文中的界面较为简单所以我们这里直接使用代码进行界面的构造。关于QtDesigner的使用参见[木兮家先生——PyQt5资源处理]。

工具准备

1. PyQt5

我们选择pip安装方式,如果你出现timeout错误,建议将pip源换为国内源,更换方法见[小程序——pip安装经常失败,更改pip源至国内镜像]。

pip install pyqt5

2. psutil

psutil是python下一个跨平台进程管理工具,本文的网速监管功能就是借助这个模块完成的,psutil模块的使用参见。

pip install psutil

正文开始

1. 构造窗体

我们的窗体是一个条型的。主要分为两个部分,左边部分用来显示当前系统内存占用比例,右边部分用来显示 当前下载网速。

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout
from PyQt5.QtGui import QColor, QFont, QPalette
from PyQt5.QtCore import Qt, QThread
import sys, psutil, time
class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        layout = QHBoxLayout(self)
        self.setLayout(layout)

        self.mem_label = QLabel('网速')
        self.net_label = QLabel('内存')

        layout.addWidget(self.mem_label)
        layout.addWidget(self.net_label)

        layout.setSpacing(0)

        pal = QPalette()
        pal.setColor(QPalette.WindowText, Qt.white)

        self.mem_label.setMinimumWidth(60)
        self.mem_label.setAlignment(Qt.AlignHCenter)
        # 设置控件背景色
        pal.setColor(QPalette.Window, Qt.green)
        self.mem_label.setAutoFillBackground(True)
        self.mem_label.setPalette(pal)

        self.net_label.setMinimumWidth(100)
        # 文本居中显示
        self.net_label.setAlignment(Qt.AlignHCenter)
        # 设置控件背景色
        pal.setColor(QPalette.Window, Qt.red)
        self.net_label.setAutoFillBackground(True)
        self.net_label.setPalette(pal)

        font = QFont("微软雅黑", 10)
        self.mem_label.setFont(font)
        self.net_label.setFont(font)

        self.mem_label.setText("0%")
        self.net_label.setText("0K/s")
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec())

2. 显示统计信息

统计信息我们使用一个新的线程去读取和计算,计算完成之后在将结果更新到我们的窗体中。

class SystemInfoThread(QThread):

    def __init__(self, window):
        super(SystemInfoThread, self).__init__()
        self.__win = window
    
    def run(self):
        old_net_speed = psutil.net_io_counters().bytes_recv
        while True:
            new_net_speed = psutil.net_io_counters().bytes_recv
            time.sleep(1)
            self.__win.net_label.setText("%.2fK/s" % ((new_net_speed - old_net_speed) / 1024))
            self.__win.mem_label.setText(str(int(psutil.virtual_memory().used * 100 / psutil.virtual_memory().total)) + '%')
            old_net_speed = new_net_speed
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys_info_thread = SystemInfoThread(win)
    sys_info_thread.start()
    sys.exit(app.exec())
tiny_indicator.png

3. 优化界面

通过上面的步骤我们的tinyd_indicator功能总算实现了,但是看起来ugly的不成样子,我们准备优化优化。

  1. 首先美化窗体
    我们在MainWindow类的__init__方法中添加窗体属性设置语句:
self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool | Qt.WindowStaysOnTopHint)
# 窗体背景透明
self.setAttribute(Qt.WA_TranslucentBackground)
self.setAutoFillBackground(False)
属性 功能
Qt.FramelessWindowHint 去掉最小化、最大化、关闭按钮
Qt.Tool 关闭状态栏显示
Qt.WindowStaysOnTopHint 始终置顶显示
tiny_indicator
  1. 加入鼠标拖动功能
    经过上面的工作后我们的指示器外观、功能都差不多完善了。但是现在有个致命的问题,我们无法更改它的显示位置(因为我们关闭了标题栏,所以无法通过标题栏进行拖动),而且它是置顶显示的所以一直遮挡着其他程序界面,所以我们再次加入鼠标拖动功能
self.__x_offset = 0
self.__y_offset = 0
def mousePressEvent(self, event):
    self.__x_offset = event.globalX() - self.pos().x()
    self.__y_offset = event.globalY() - self.pos().y()

def mouseMoveEvent(self, event):
    self.move(event.globalX() - self.__x_offset, event.globalY() - self.__y_offset)

结束语

至此我们的网速指示器开发完成,依然很难看,动手能力强的朋友可以自己修改两个QLabel的背景让他更加完善、美观。

上一篇 下一篇

猜你喜欢

热点阅读