cursor+python輕松實現電腦監控

小伙伴們,今天我們利用cursor不寫一行代碼開發一個電腦的系統狀態監控小應用!

下載安裝cursor:

網址:https://www.cursor.com/cn

Image

下載后雙擊安裝

Image

Image

Image

??

輸入提示詞:? ? ? ?

制作一個winswos應用,實現顯示時間精確到秒,
顯示cpu溫度、cpu占用率,顯示顯卡GPU的溫度和使用率,
內存的占用率,用戶可自定義窗體界面大小,背景顏色,透明度,顯示層級。
字體大小可調節。利用python pyqt5 實現

Image

自動生成代碼,選擇:accept all

Image

生成的代碼 運行結果如下:

Image

我們來進行優化:

優化功能,添加大核小核占用率,cpu gpu 相關數據未能正常讀取。 界面優化 參考蘋果IOS風格

Image

Image

期間如果遇到問題直接用自然語言提問給cursor,cursor會自動解決更新代碼,經過幾輪問答最終成果如下:

Image

完整代碼:

import sys
import psutil
import requests
import wmi
from datetime import datetime
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QVBoxLayout, QColorDialog, QSlider,?QPushButton, QFontDialog, QCheckBox, QFrame, QScrollArea
)
from PyQt5.QtCore import QTimer, Qt, QMutex
from PyQt5.QtGui import QColor, QFontclass HardwareMonitor:@staticmethoddef get_data():"""獲取硬件數據,支持OpenHardwareMonitor和備用方案"""try:resp = requests.get("http://localhost:8085/data.json", timeout=1)resp.raise_for_status()return?resp.json()except Exception:return?HardwareMonitor.get_fallback_data()@staticmethoddef get_cpu_temp_wmi():w = wmi.WMI(namespace="root\\wmi")try:temps = w.MSAcpi_ThermalZoneTemperature()if?temps:# 溫度單位是 1/10 Kelvinreturn?[round(t.CurrentTemperature / 10.0 - 273.15, 1)?for?t?in?temps]except Exception:passreturn?[]@staticmethoddef get_fallback_data():"""當OpenHardwareMonitor不可用時使用的備用數據獲取方案"""cpu_percent = psutil.cpu_percent()mem = psutil.virtual_memory()cpu_freq = psutil.cpu_freq()# 優先用wmi真實溫度cpu_temps = HardwareMonitor.get_cpu_temp_wmi()if?cpu_temps:cpu_temp_value = cpu_temps[0]else:cpu_temp_value = HardwareMonitor.estimate_cpu_temp()# 創建模擬的硬件數據結構return?{"Children": [{"Text":?"CPU","Children": [{"Text":?"Temperatures","Children": [{"Text":?"CPU",?"Value": cpu_temp_value}]},{"Text":?"Load","Children": [{"Text":?"Total",?"Value": cpu_percent}]},{"Text":?"Clock","Children": [{"Text":?"CPU",?"Value": cpu_freq.current?if?cpu_freq?else?None}]}]},{"Text":?"Memory","Children": [{"Text":?"Data","Children": [{"Text":?"Used",?"Value": mem.percent}]}]}]}@staticmethoddef estimate_cpu_temp():"""根據CPU使用率估算溫度(模擬值)"""cpu_percent = psutil.cpu_percent()# 基礎溫度 + 使用率影響base_temp = 40.0temp_increase = cpu_percent * 0.3return?min(base_temp + temp_increase, 95.0) ?# 限制最高溫度@staticmethoddef parse_temperatures(data):cpu_temp = Nonecpu_candidates = []if?not data or?"Children"?not?in?data:return?None, Nonedef traverse(node):nonlocal cpu_candidatesif"Temperatures"in?node.get("Text",?""):for?child?in?node.get("Children", []):value = child.get("Value")if?value is not None:name = child.get("Text",?"").lower()if"cpu"in?name or?"package"in?name:cpu_candidates.append(value)for?child?in?node.get("Children", []):traverse(child)for?child?in?data["Children"]:traverse(child)if?cpu_candidates:cpu_temp = max(cpu_candidates)return?cpu_temp, None@staticmethoddef parse_usage(data):cpu_load = Noneif?not data or?"Children"?not?in?data:return?None, []def traverse(node):nonlocal cpu_loadif"Load"in?node.get("Text",?""):for?child?in?node.get("Children", []):value = child.get("Value")if?value is not None:name = child.get("Text",?"").lower()if"cpu"in?name or?"total"in?name:cpu_load = valuefor?child?in?node.get("Children", []):traverse(child)for?child?in?data["Children"]:traverse(child)return?cpu_load, []class CardFrame(QFrame):def __init__(self, parent=None):super().__init__(parent)self.setStyleSheet('''QFrame {background: rgba(255,255,255,0.85);border-radius: 14px;border: 1px solid #e0e0e0;margin: 4px;padding: 6px;}''')class MonitorWidget(QWidget):def __init__(self):super().__init__()self.setWindowTitle("系統監控")self.resize(380, 300)self.setWindowOpacity(0.97)self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)self.setStyleSheet("background: #f6f7fa;")main_layout = QVBoxLayout(self)main_layout.setContentsMargins(8, 8, 8, 8)main_layout.setSpacing(4)# 時間卡片self.card_time = CardFrame()vbox_time = QVBoxLayout(self.card_time)vbox_time.setContentsMargins(4, 2, 4, 2)self.label_date = QLabel()self.label_date.setFont(QFont("Arial", 12, QFont.Bold))self.label_date.setStyleSheet("color: #555; margin-bottom: 0px;")self.label_time = QLabel()self.label_time.setFont(QFont("Arial", 18, QFont.Bold))self.label_time.setStyleSheet("color: #222; margin-bottom: 0px;")vbox_time.addWidget(self.label_date)vbox_time.addWidget(self.label_time)main_layout.addWidget(self.card_time)# CPU卡片self.card_cpu = CardFrame()vbox_cpu = QVBoxLayout(self.card_cpu)vbox_cpu.setContentsMargins(4, 2, 4, 2)self.label_cpu_temp = QLabel("CPU溫度: 初始化中...")self.label_cpu_temp.setFont(QFont("Arial", 12))self.label_cpu_temp.setStyleSheet("color: #444;")self.label_cpu_load = QLabel("CPU總占用: 初始化中...")self.label_cpu_load.setFont(QFont("Arial", 12))self.label_cpu_load.setStyleSheet("color: #444;")vbox_cpu.addWidget(self.label_cpu_temp)vbox_cpu.addWidget(self.label_cpu_load)main_layout.addWidget(self.card_cpu)# 內存卡片self.card_mem = CardFrame()vbox_mem = QVBoxLayout(self.card_mem)vbox_mem.setContentsMargins(4, 2, 4, 2)self.label_mem = QLabel()self.label_mem.setFont(QFont("Arial", 12))self.label_mem.setStyleSheet("color: #444;")vbox_mem.addWidget(self.label_mem)main_layout.addWidget(self.card_mem)# 控件卡片self.card_ctrl = CardFrame()vbox_ctrl = QVBoxLayout(self.card_ctrl)vbox_ctrl.setContentsMargins(4, 2, 4, 2)btn_color = QPushButton("背景顏色")btn_color.setFont(QFont("Arial", 10))btn_color.clicked.connect(self.choose_color)vbox_ctrl.addWidget(btn_color)slider_opacity = QSlider(Qt.Horizontal)slider_opacity.setMinimum(50)slider_opacity.setMaximum(100)slider_opacity.setValue(97)slider_opacity.valueChanged.connect(self.set_opacity)vbox_ctrl.addWidget(slider_opacity)btn_font = QPushButton("字體設置")btn_font.setFont(QFont("Arial", 10))btn_font.clicked.connect(self.choose_font)vbox_ctrl.addWidget(btn_font)self.cb_top = QCheckBox("窗口置頂")self.cb_top.setFont(QFont("Arial", 10))self.cb_top.setChecked(True)self.cb_top.stateChanged.connect(self.set_topmost)vbox_ctrl.addWidget(self.cb_top)main_layout.addWidget(self.card_ctrl)# 定時器與刷新鎖self.refresh_mutex = QMutex()self.timer = QTimer(self)self.timer.timeout.connect(self.safe_update_info)self.timer.start(1500)def safe_update_info(self):if?self.refresh_mutex.tryLock():try:self.update_info()finally:self.refresh_mutex.unlock()else:passdef update_info(self):now = datetime.now()week_map = ['星期一','星期二','星期三','星期四','星期五','星期六','星期日']date_str = now.strftime("%Y-%m-%d ") + week_map[now.weekday()]time_str = now.strftime("%H:%M:%S")self.label_date.setText(date_str)self.label_time.setText(time_str)data = HardwareMonitor.get_data()cpu_temp, _ = HardwareMonitor.parse_temperatures(data)cpu_load, _ = HardwareMonitor.parse_usage(data)mem = psutil.virtual_memory()self.label_cpu_temp.setText(f"CPU溫度: {cpu_temp if cpu_temp is not None else 'N/A'}")self.label_cpu_load.setText(f"CPU總占用: {cpu_load if cpu_load is not None else 'N/A'}%")self.label_mem.setText(f"內存占用: {mem.percent:.1f}%")def choose_color(self):color = QColorDialog.getColor()if?color.isValid():self.setStyleSheet(f"background: {color.name()};")def set_opacity(self, value):self.setWindowOpacity(value / 100)def choose_font(self):font, ok = QFontDialog.getFont()if?ok:for?label?in?[self.label_date, self.label_time,?self.label_cpu_temp, self.label_cpu_load,self.label_mem]:label.setFont(font)def set_topmost(self, state):if?state == Qt.Checked:self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)else:self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)self.show()if?__name__ ==?"__main__":app = QApplication(sys.argv)w = MonitorWidget()w.show()sys.exit(app.exec_())

感謝大家的點贊和關注,我們下期見!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97990.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97990.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信號調制與解調 matlab仿真

信號調制與解調 matlab仿真 原始信號--頻譜為cos(Wt*w)函數,外形如饅頭調制解調傅里葉變換測試FT的頻譜是否為鋸齒波理想低通濾波器,截至頻率Wm傅里葉變換頻譜為鋸齒波函數的時域信號函數傅里葉變換調制頻率1理想低通濾波調制頻率2理想低通濾波 % 調制定理演示Dem…

IIS服務器下做瀏覽器緩存

你的這個問題問得非常好&#xff0c;很多開發者在同時使用重寫和緩存時都會遇到。簡單來說&#xff1a;你添加的 <staticContent> 和 <clientCache> 配置本身不會影響或干擾 重寫規則的工作。它們各司其職&#xff0c;在 IIS 處理請求的不同階段發揮作用。 但是&a…

Flutter 3.35.2 以上版本中 數字轉字符串的方法指南

在 Flutter 3.35.2 (對應 Dart 2.19 及以上版本) 中&#xff0c;將數字轉換為字符串主要依賴于 Dart 語言本身提供的原生方法。這些方法穩定且向后兼容。下面我為你介紹幾種主要的方法和案例。 &#x1f522; 數字轉字符串的基本方法方法名適用類型描述常用場景toString()int, …

C#基礎(⑤ProcessStartInfo類和Process類)

1. 它是什么&#xff1f;ProcessStartInfo 是 C# 里的一個類&#xff08;屬于 System.Diagnostics 命名空間&#xff09;&#xff0c;作用是&#xff1a;定義要啟動的程序路徑&#xff08;比如 notepad.exe&#xff09;設置啟動時的參數&#xff08;比如打開哪個文件&#xff0…

《設計模式之禪》筆記摘錄 - 19.備忘錄模式

備忘錄模式的定義備忘錄模式(Memento Pattern)提供了一種彌補真實世界缺陷的方法&#xff0c;讓“后悔藥”在程界序的世界中真實可行&#xff0c;其定義如下&#xff1a;Without violating encapsulation, capture and externalize an objects internal state so that the obje…

22、Jenkins容器化部署Java應用

22、Jenkins容器化部署Java應用 1、準備Dockerfile 將Dockerfile文件放入項目目錄下 FROM registry.cn-hangzhou.aliyuncs.com/xx_blog/openjdk:21-jdk LABEL maintainer"xxqq.com" #復制打好的jar包 COPY target/*.jar /app.jar RUN apk add -U tzdata; \ ln -sf /…

基于單片機智能水龍頭/智能洗漱臺設計

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 該設計采用單片機作為核心控制器&#xff0c;結合紅外傳感器、水流傳感器和電磁閥等模塊&#xf…

GD32入門到實戰30--產品配置參數存儲方案 (EEPROM)

我們之前已經實現eeprom的驅動了&#xff0c;我們在應用層實現產品配置參數存儲方案我們要實現&#xff1a;原本設定的modebus從機&#xff08;單片機&#xff09;地址是01&#xff0c;存儲在eeprom里&#xff0c;按下按鍵后修改地址為03&#xff0c;重新上電modebus從機&#…

find_code 插件 react_vite

find_code 插件 react_vite const fs require("fs"); const path require("path"); const parser require("babel/parser"); const traverse require("babel/traverse").default; const generate require("babel/generator&…

手機秒變全棧IDE:Claude Code UI的深度體驗

還在為只能在命令行中使用Claude Code而苦惱嗎&#xff1f;想在移動設備上繼續你的AI編程對話嗎&#xff1f;Claude Code UI的出現徹底改變了這一切。這個開源項目為Anthropic官方的Claude Code CLI工具提供了現代化的Web界面&#xff0c;讓你能夠在任何設備、任何地方與AI編程…

F5發布后量子API安全解決方案,以AI驅動全面防護應對量子計算威脅

量子計算的飛速演進&#xff0c;正對傳統加密體系構成日益嚴峻的安全威脅。Gartner預測顯示&#xff0c;到2029年&#xff0c;量子計算機有望攻破目前普遍采用的公鑰加密算法&#xff0c;這一風險正倒逼全球企業加速密碼體系的更迭與升級。面對這一挑戰&#xff0c;F5公司——應…

深度剖析 DC - DC 轉換器在新能源汽車中的關鍵應用

在新能源汽車的發展進程中&#xff0c;DC - DC 轉換器扮演著至關重要的角色。以下將詳細介紹其在新能源汽車上的應用&#xff0c;包括作用、電路組成以及工作原理等方面。DC - DC 轉換器的作用簡單來說&#xff0c;新能源汽車上的 DC - DC 轉換器是一個 “降壓型電壓變換器”。…

【標準項目】在線五子棋對決(下)

在線五子棋對決一. 項目介紹及鏈接二. 項目結構設計項目模塊劃分業務處理模塊的子模塊劃分項目流程圖玩家流程圖服務器流程圖三. 數據管理模塊數據庫設計創建 user_table 類四. 在線用戶管理模塊五. 游戲房間管理模塊游戲房間類實現游戲房間管理類實現六. Session 管理模塊Sess…

重構導航之核:高德地圖的深度學習架構解析 導論:從數字化世界到可計算世界

導論&#xff1a;從數字化世界到可計算世界 數字地圖的演進&#xff0c;本質上是一場關于“世界可計算性”的持續探索。第一代地圖的核心任務是數字化轉錄&#xff08;Digital Transcription&#xff09;&#xff0c;它成功地將物理世界的靜態元素——道路、建筑、興趣點&#…

邏輯回歸(sigmoid函數、混淆矩陣、精確率召回率F1)

目錄 一、概述 1、邏輯回歸 2、激活函數 sigmoid函數 3、最大似然估計 二、邏輯回歸 1、原理 2、損失函數 3、代碼 三、混淆矩陣 1、定義 2、舉例 3、代碼 四、分類評估方法 1、精確率&#xff08;Precision&#xff09; 2、召回率&#xff08;Recall&#xff09; 3、F1&#…

Redis底層實現原理之五大基礎結構

文章目錄1. 基礎結構和編碼類型2. 編碼類型和數據結構實現2.1 字符串&#xff08;String&#xff09;2.2 壓縮列表&#xff08;listpack&#xff09;2.3 哈希表&#xff08;hashtable&#xff09;2.4 快速列表&#xff08;quicklist&#xff09;2.5 整數集合&#xff08;intset…

火山引擎數據智能體DataAgent總結分享

數據的冰山:看得見的資產與看不見的鴻溝 這張圖片用“冰山”類比的方式展示了數據資產管理中的可見與不可見問題,并突出了數據利用的核心挑戰與潛在陷阱。 1. 冰山之上的“看得見的資產” 內容:數據庫、報表、指標等結構化、顯性的數據資源。 核心挑戰: 需要從“采集存儲”…

100種高級數據結構 (速查表)

一、 基礎結構的擴展與組合 (Advanced Linear Structures) 這些結構在數組、鏈表、隊列、棧等基礎結構上增加了特定功能或約束。雙端隊列 (Deque - Double-Ended Queue) 介紹&#xff1a;允許在隊列的前后兩端都進行插入和刪除操作的線性結構。應用場景&#xff1a;工作竊取算法…

一個開源的企業官網簡介

簡介一個完美的企業官網系統,支持手機端和電腦端展示企業風采,還可以展示企業產品/企業新聞資訊等等.普通用戶PC端展示普通用戶手機端展示管理后臺

TCP實現線程池競爭任務

服務端&#xff1a;#include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netinet/ip.h> #include<strings.h> #include<unistd.h> #include<ctype.h> #include<arpa/inet.h&…