(2025.01.04) コード修正
前回記事に続いて、小さいタイプのCPU使用率グラフを作ってみた。
前回記事は以下の通り。これは Mac 標準のアクティビティモニタの CPU history に相当するものであった。
Python tkinter:CPU使用率グラフを作る(1)
下の写真において、前回作ったものが、縦長の60秒間の履歴を示すもので、今回作成したものが時計の横にある小さいタイプのものである。これは履歴は示さず、その時々でどのCPUが動いているかを示すもの。利用率の表示には8個の Progressbar を用いている。これは Mac 標準のアクティビティモニタの CPU usage に相当するものである。
環境は以下の通り。
MacBook Pro 14"
Chip Apple M1 Pro (8-core CPU, 14-core GPU)
Memory 16GB
Storage 512GB SSD
macOS Sequoia 15.2
Python 3.13.1
Tcl/Tk 9.0.1
軽い処理
並列処理により全コア使用
小さいものと大きなもので、数値が異なっているが、これはスタートのタイミングのずれによるものと思われる、厳密な数値を問題にするソフトでもないので大体同じ数値が出ていれば良しとする。
コードは以下の通り。
import tkinter as tk
from tkinter import ttk
import numpy as np
import psutil
def update():
global root,lb2,val,mlb
r=psutil.cpu_percent(interval=1, percpu=True)
for k in range(0,len(r)):
lb2[k]['text']='{0:.1f}'.format(r[k])
val[k]['value']=r[k]
mlb[1]['text']='{0:6.1f}%'.format(sum(r)/len(r))
mlb[3]['text']='{0:6.1f}%'.format(psutil.virtual_memory().percent)
root.after(1000, update)
def main():
global root,lb2,val,mlb
# basin parameter
nc=psutil.cpu_count() # number pf cores
cpu=[]
for i in range(0,nc):
s='P' # performance core
if 0<=i<=1: s='E' # efficiency core
cpu.append('{0}-{1}'.format(i+1,s))
# GUI
root =tk.Tk()
root.resizable(False,False)
root.title('CPU & Mem')
style=ttk.Style()
style.theme_use('alt')
fontn='Calibri 10'
fontb='Calibri 12 bold'
style.configure('.',font=(fontn))
style.configure('.',background='#393939',foreground='#ffffff')
style.configure('Horizontal.TProgressbar', background='#999999')
style.configure('Horizontal.TProgressbar', troughcolor='#0f0f0f')
style.configure("Horizontal.TProgressbar", bordercolor='#393939')
frame0=ttk.Frame(root)
lb1=np.empty(nc,dtype=object)
lb2=np.empty(nc,dtype=object)
val=np.empty(nc,dtype=object)
for k in range(0,nc):
lb1[k]=ttk.Label(frame0,text=cpu[k],borderwidth=0,relief=tk.SOLID,anchor=tk.CENTER,width=3)
lb2[k]=ttk.Label(frame0,text='',borderwidth=0,relief=tk.SOLID,anchor=tk.CENTER,width=5)
val[k]=ttk.Progressbar(frame0,orient='horizontal',length=70,maximum=100,mode='determinate')
lb1[k].grid(row=k,column=0)
lb2[k].grid(row=k,column=1)
val[k].grid(row=k,column=2)
frame0.pack()
frame1=ttk.Frame(root)
nn=4
mlb=np.empty(nn,dtype=object)
txt=['CPU','','MEM','']
for k in range(0,len(mlb)):
mlb[k]=ttk.Label(frame1,text=txt[k],borderwidth=1,relief=tk.SOLID,anchor=tk.CENTER,width=7,font=(fontb))
i,j=k//2,k%2
mlb[k].grid(row=i,column=j)
frame1.pack()
update()
root.mainloop()
if __name__ == '__main__': main()
以 上