窗口小插件,用于显示当前系统时间,CPU与内存占用率,网络上传下载速度-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

最近在弄一个小玩意儿旨在生成一个窗口小插件用于显示当前系统时间CPU与内存占用率网络上传下载速度
初始目标

  1. 生成一个弹窗窗口置顶
  2. 弹窗内可以进行设定勾选想要显示的对应信息调整窗口透明度
  3. 在用户关闭应用时结束程序
  4. 最后打包成一个可执行的文件不以python档案存在
    前置条件
    python3
    需要额外安装的库
    tkinter 生成窗口
    psutil 监控系统资源
    pyinstaller 打包python脚本成exe档案

详细代码如下

import tkinter as tk  
from tkinter import ttk
import psutil  
import time
  
class myClass:
    def __init__(self):
        # 创建主窗口 
        self.root = tk.Tk()  
        self.root.title("配置窗口")
        self.root.geometry("400x300") # 设定窗口大小为300像素宽200像素高
        self.x = 0
        #监控系统网络资源包含上传下载等...
        self.net_io_counters = psutil.net_io_counters()  
        self.download_speed_b = self.net_io_counters.bytes_recv 
        self.upload_speed_b = self.net_io_counters.bytes_sent

    def mainWin(self):
        root = self.root
        self.var1 = tk.IntVar() # 创建变量用于选项1的勾选状态 
        self.r = 1   
        #生成一个按钮在root上显示文字为 ’时间‘
        check1 = ttk.Checkbutton(root, text="时间", variable=self.var1) 
        #把按钮显示在窗口上 row 和 column代表位置padx,pady表示和边界距离
        check1.grid(row=self.r, column=0, padx=10,pady=10) 
        self.r += 1     #每一项往下移动一行避免显示覆盖
        self.var2 = tk.IntVar()
        check2 = ttk.Checkbutton(root, text="CPU与内存", variable=self.var2)  
        check2.grid(row=self.r, column=0, padx=10,pady=10)
        self.r += 1
        self.var3 = tk.IntVar() 
        check3 = ttk.Checkbutton(root, text="网络", variable=self.var3)  
        check3.grid(row=self.r, column=0, padx=10,pady=10)
        self.r += 1
        # 创建滑动条提示
        self.var4 = tk.Text(root, height=1, width=25)
        self.var4.grid(row=self.r,column=0,padx=10,pady=10)
        self.var4.insert(tk.END, "高 <--窗口透明度--> 低")
        self.r += 1
        #创建滑动条 (4-100)设定为0的话全透明到时找不到怎么关窗口了  
        slider = ttk.Scale(root, from_=4, to=100, orient=tk.HORIZONTAL, command=self.on_slider_change)  
        slider.grid(row=self.r, column=0, padx=10,pady=10)
        # 创建文本框用于显示选择值  
        self.text_box = tk.Text(root, height=1, width=5)  
        self.text_box.grid(row=self.r, column=1, padx=10,pady=10)
        self.r += 1
        ttk.Button(root, text="执行配置", command=self.updateInfo).grid(row=self.r, column=0, padx=10)
        #root.attributes("-alpha", 1)  # 设置主窗口默认窗口透明度    
        root.mainloop()

    def on_slider_change(self,value):
        self.value = round(float(value),1) 
        self.text_box.delete(1.0, tk.END)  # 清空文本框内容  
        self.text_box.insert(tk.END, self.value)  # 插入当前选择值到文本框
        self.root.attributes("-alpha", self.value/100)  # 设置窗口透明度 

    def updateInfo(self):
        #self.root.withdraw()
        if self.x == 0:
            self.sWin = tk.Tk()
            self.sWin.attributes("-topmost", True) # 将窗口置于其他窗口之上  
            self.sWin.attributes("-alpha", self.value/100)  # 设置窗口透明度
            self.sWin.protocol("WM_DELETE_WINDOW", self.closeRoot)   #设定点击右上角"X"时执行的动作
            if self.var1.get() == 1:
                #设定一个标签 tk.Label(窗口font=(字体大小样式【bold粗体】)bg="white" 背景颜色为白色)
                self.clock = tk.Label(self.sWin, font=("times", 40, "bold"), bg="white") 
                #内容显示到窗口中fill="both"上下都填充expand=1允许填充 
                self.clock.pack(fill="both", expand=1)
            if self.var2.get() == 1:
                self.cpumem = tk.Label(self.sWin, font=("times", 20, "bold"), bg="white")  
                self.cpumem.pack(fill="both", expand=1)
            if self.var3.get() == 1:
                self.netwok = tk.Label(self.sWin, font=("times", 20, "bold"), bg="white")  
                self.netwok.pack(fill="both", expand=1)
            self.x = 1
            #var1.get()  抓取我们窗口上 勾选选项的值0为未勾选1为勾选
            self.myvalue = [self.var1.get(),self.var2.get(),self.var3.get()]
        if self.myvalue[0] == 1:        
            #更新时间
            current_time = time.strftime("%H:%M:%S")  
            self.clock.config(text=current_time)
        if self.myvalue[1] == 1:    
            #更新CPU和mem使用率
            cpu = str(psutil.cpu_percent())
            mem = str(psutil.virtual_memory().percent)
            #下面时判断下内存占用率大于70设定橘黄色大于90红色其他的黑色字体
            if (float(mem) > 70) or (float(cpu) > 70):
                self.mycolor = "orange"
            elif (float(mem) > 90) or (float(cpu) > 90):
                self.mycolor = "red"
            else:
                self.mycolor = "black"
            self.cpumem.config(text="cpu:"+cpu+"% mem:"+mem+"%",fg=self.mycolor)
        if self.myvalue[2] == 1:
            #更新网络上传下载速度
            #while True:
            net_io_counters = psutil.net_io_counters()
            self.download_speed_a = net_io_counters.bytes_recv  
            self.upload_speed_a = net_io_counters.bytes_sent   
            self.download_speed = round((self.download_speed_a - self.download_speed_b) / 1024,2) # 转换为KB/s
            self.upload_speed = round((self.upload_speed_a - self.upload_speed_b) / 1024,2) # round(x,2) 浮点数保留两位小数
            self.download_speed_b = self.download_speed_a
            self.upload_speed_b = self.upload_speed_a

            self.netwok.config(text="up:"+str(self.upload_speed)+"KB/s down:"+str(self.download_speed)+"KB/s")
                
        if self.myvalue[0] == 1:
            #等待1000ms再次执行函数旨在每秒刷新一次窗口显示的内容
            self.clock.after(1000, self.updateInfo)
        else:
            if self.myvalue[1] == 1:
                self.cpumem.after(1000, self.updateInfo)
            else:
                self.netwok.after(1000, self.updateInfo)
    def closeRoot(self):
        #设定当我点击关闭窗口时彻底破坏窗口。可以达到停止脚本运行的目的
        self.sWin.destroy()
        self.root.destroy()

if __name__ == "__main__":
    app = myClass()
    app.mainWin()


"""# 创建标签和输入框  
ttk.Label(root, text="用户名").grid(row=0)  
user_entry = ttk.Entry(root)  
user_entry.grid(row=0, column=1)  
ttk.Label(root, text="密码").grid(row=1)  
password_entry = ttk.Entry(root, show="*")  
password_entry.grid(row=1, column=1)"""

打包代码
pyinstaller -w x.py -F
使用pyinstaller进行打包
-w 表示隐藏执行的CMD窗口
x.py 是python脚本
-F 代表打包成独立的执行文件也就是一个exe档案不加这个参数会多生成文件夹放到其他环境需要把文件夹也带上不然无法执行
执行完毕后会生成两个文件夹
build和dist
我们的执行文件再dist里面这个exe档案可以放到任意其他电脑上双击直接执行不需要其他电脑先下载库文件等等
以下是示例照片
在这里插入图片描述
在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6