Python PyQt5實戰(zhàn)項目之網(wǎng)速監(jiān)控器的實現(xiàn)
簡介
看到了一個能夠輕松實現(xiàn)獲取系統(tǒng)運行的進程和系統(tǒng)利用率(包括CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等)信息的模塊–psutil模塊。這次利用psutil.net_io_counters()這個方法。
psutil模塊使用
>>> psutil.net_io_counters() # 獲取網(wǎng)絡(luò)讀寫字節(jié)/包的個數(shù)
snetio(bytes_sent=16775953, bytes_recv=712657945, packets_sent=216741, packets_recv=485775, errin=0, errout=0, dropin=0, dropout=0)
bytes_sent:上傳數(shù)據(jù)
bytes_recv: 接收數(shù)據(jù)
主界面
class NetWindows(QMainWindow): net_signal = pyqtSignal(str,str) def __init__(self): super(NetWindows,self).__init__() self.ui_init() self.thread_init() def ui_init(self): self.setWindowTitle('網(wǎng)速') self.resize(200,80) self.setWindowOpacity(0.9) # 設(shè)置窗口透明度 self.setWindowFlag(Qt.FramelessWindowHint) # 隱藏邊框 self.setWindowFlag(Qt.WindowStaysOnTopHint) # 窗口始終顯示在最前面 self.upload_icon = QLabel() self.upload_icon.setPixmap(QPixmap(':res/upload.png')) self.upload_icon.setScaledContents(True) self.download_icon = QLabel() self.download_icon.setPixmap(QPixmap(':res/download.png')) self.download_icon.setScaledContents(True) self.upload_text = QLabel() self.upload_text.setText('upload: ') self.download_text = QLabel() self.download_text.setText('download: ') self.upload_lab = QLabel() self.download_lab = QLabel() self.g_layout = QGridLayout() self.g_layout.addWidget(self.upload_icon,0,0,1,1) self.g_layout.addWidget(self.download_icon,1,0,1,1) self.g_layout.addWidget(self.upload_text,0,1,1,1) self.g_layout.addWidget(self.download_text,1,1,1,1) self.g_layout.addWidget(self.upload_lab,0,2,1,4) self.g_layout.addWidget(self.download_lab,1,2,1,4) self.widget = QWidget() self.widget.setLayout(self.g_layout) self.setCentralWidget(self.widget) def thread_init(self): self.net_thread = NetThread() self.net_thread.net_signal.connect(self.net_slot) self.net_thread.start(1000) def variate_init(self): self.upload_content = '' self.download_content = '' def net_slot(self,upload_content,download_content): self.upload_lab.setText(upload_content) self.download_lab.setText(download_content) def mousePressEvent(self, event): ''' 重寫按下事件 ''' self.start_x = event.x() self.start_y = event.y() def mouseMoveEvent(self, event): ''' 重寫移動事件 ''' dis_x = event.x() - self.start_x dis_y = event.y() - self.start_y self.move(self.x()+dis_x, self.y()+dis_y)
- mousePressEvent()
獲取鼠標(biāo)按下時的坐標(biāo)位置(相對于窗口左上角)
- mouseMoveEvent()
當(dāng)鼠標(biāo)處于按下狀態(tài)并開始移動時,鼠標(biāo)離窗口左上角的位置會不斷更新并保存在event.x()和event.y()中。
我們將更新后的x和y值不斷減去鼠標(biāo)按下時的坐標(biāo)位置,就可以知道鼠標(biāo)移動的距離。最后再調(diào)用move方法將窗口當(dāng)前坐標(biāo)加上移動距離即可
網(wǎng)速線程
class NetThread(QThread): net_signal = pyqtSignal(str,str) def __init__(self): super(NetThread,self).__init__() def net_func(self): parameter = psutil.net_io_counters() recv1 = parameter[1] #接收數(shù)據(jù) send1 = parameter[0] #上傳數(shù)據(jù) time.sleep(1) # 每隔1s監(jiān)聽端口接收數(shù)據(jù) parameter = psutil.net_io_counters() recv2 = parameter[1] send2 = parameter[0] self.upload_content = '{:.1f} kb/s.'.format((send2 - send1) / 1024.0) self.download_content = '{:.1f} kb/s.'.format((recv2 - recv1) / 1024.0) def run(self): while(1): self.net_func() self.net_signal.emit(self.upload_content,self.download_content) time.sleep(1)
全部代碼
import sys import time import psutil from PyQt5.QtWidgets import QApplication, QHBoxLayout, QMainWindow, QWidget, QFrame, QLabel, QVBoxLayout, QGridLayout from PyQt5.QtCore import Qt, pyqtSignal, QThread from PyQt5.QtGui import QPixmap import res class NetWindows(QMainWindow): net_signal = pyqtSignal(str,str) def __init__(self): super(NetWindows,self).__init__() self.ui_init() self.thread_init() def ui_init(self): self.setWindowTitle('網(wǎng)速') self.resize(200,80) self.setWindowOpacity(0.9) # 設(shè)置窗口透明度 self.setWindowFlag(Qt.FramelessWindowHint) # 隱藏邊框 self.setWindowFlag(Qt.WindowStaysOnTopHint) # 窗口始終顯示在最前面 self.upload_icon = QLabel() self.upload_icon.setPixmap(QPixmap(':res/upload.png')) self.upload_icon.setScaledContents(True) self.download_icon = QLabel() self.download_icon.setPixmap(QPixmap(':res/download.png')) self.download_icon.setScaledContents(True) self.upload_text = QLabel() self.upload_text.setText('upload: ') self.download_text = QLabel() self.download_text.setText('download: ') self.upload_lab = QLabel() self.download_lab = QLabel() self.g_layout = QGridLayout() self.g_layout.addWidget(self.upload_icon,0,0,1,1) self.g_layout.addWidget(self.download_icon,1,0,1,1) self.g_layout.addWidget(self.upload_text,0,1,1,1) self.g_layout.addWidget(self.download_text,1,1,1,1) self.g_layout.addWidget(self.upload_lab,0,2,1,4) self.g_layout.addWidget(self.download_lab,1,2,1,4) self.widget = QWidget() self.widget.setLayout(self.g_layout) self.setCentralWidget(self.widget) def thread_init(self): self.net_thread = NetThread() self.net_thread.net_signal.connect(self.net_slot) self.net_thread.start(1000) def variate_init(self): self.upload_content = '' self.download_content = '' def net_slot(self,upload_content,download_content): self.upload_lab.setText(upload_content) self.download_lab.setText(download_content) def mousePressEvent(self, event): ''' 重寫按下事件 ''' self.start_x = event.x() self.start_y = event.y() def mouseMoveEvent(self, event): ''' 重寫移動事件 ''' dis_x = event.x() - self.start_x dis_y = event.y() - self.start_y self.move(self.x()+dis_x, self.y()+dis_y) class NetThread(QThread): net_signal = pyqtSignal(str,str) def __init__(self): super(NetThread,self).__init__() def net_func(self): parameter = psutil.net_io_counters() recv1 = parameter[1] #接收數(shù)據(jù) send1 = parameter[0] #上傳數(shù)據(jù) time.sleep(1) # 每隔1s監(jiān)聽端口接收數(shù)據(jù) parameter = psutil.net_io_counters() recv2 = parameter[1] send2 = parameter[0] self.upload_content = '{:.1f} kb/s.'.format((send2 - send1) / 1024.0) self.download_content = '{:.1f} kb/s.'.format((recv2 - recv1) / 1024.0) def run(self): while(1): self.net_func() self.net_signal.emit(self.upload_content,self.download_content) time.sleep(1) if __name__ == '__main__': app = QApplication(sys.argv) dispaly = NetWindows() dispaly.show() netwidows = NetWindows() sys.exit(app.exec_())
成果展示
到此這篇關(guān)于Python PyQt5實戰(zhàn)項目之網(wǎng)速監(jiān)控器的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python PyQt5 網(wǎng)速監(jiān)控器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 十個Python練手的實戰(zhàn)項目,學(xué)會這些Python就基本沒問題了(推薦)
- 分享7個 Python 實戰(zhàn)項目練習(xí)
- Python實戰(zhàn)項目刮刮樂的實現(xiàn)詳解流程
- Python實戰(zhàn)項目之MySQL tkinter pyinstaller實現(xiàn)學(xué)生管理系統(tǒng)
- python實戰(zhàn)項目scrapy管道學(xué)習(xí)爬取在行高手?jǐn)?shù)據(jù)
- python游戲?qū)崙?zhàn)項目之童年經(jīng)典超級瑪麗
- python游戲的魅力之冒險島實戰(zhàn)項目
- Python實戰(zhàn)項目用PyQt5制作漫畫臉GUI界面
- python爬蟲實戰(zhàn)項目之爬取pixiv圖片
- 使用python來玩一次股票代碼詳解
相關(guān)文章
Python PyQt5學(xué)習(xí)之樣式設(shè)置詳解
這篇文章主要為大家詳細(xì)介紹了Python PyQt5中樣式設(shè)置的相關(guān)資料,例如為標(biāo)簽添加背景圖片、為按鈕添加背景圖片、設(shè)置窗口透明等,感興趣的可以學(xué)習(xí)一下2022-12-12對pandas數(shù)據(jù)判斷是否為NaN值的方法詳解
今天小編就為大家分享一篇對pandas數(shù)據(jù)判斷是否為NaN值的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11