CPU Anzeige (win32)

Ein Beispiel wie man mittels Threads in einem Tk-Fenster die aktuelle CPU-Auslastung anzeigt (benötigt allerdings pywin32 und läuft somit nur auf Windows).

   1 #!/usr/bin/env python
   2 
   3 import threading
   4 import Queue
   5 import time
   6 import Tkinter
   7 import win32com.client
   8 import pythoncom
   9 
  10 class MeinProzessor(threading.Thread):
  11     def __init__(self, q):
  12         threading.Thread.__init__(self)
  13         self.q = q
  14         self.cancel = False
  15 
  16     def run(self):
  17         pythoncom.CoInitialize()
  18         try:
  19             strComputer = "."
  20             objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
  21             objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
  22 
  23             while True:
  24                 if self.cancel:
  25                     break
  26 
  27                 colItems = objSWbemServices.ExecQuery("Select * from Win32_Processor")
  28                 s = ""
  29                 for id, objItem in enumerate(colItems):
  30                     s += "CPU %s: %s %%\n" % (id, objItem.LoadPercentage)
  31                 self.q.put(s)
  32 
  33                 print s
  34 
  35                 time.sleep(2)
  36         finally:
  37             try:
  38                 pythoncom.CoUninitialize()
  39             except:
  40                 pass
  41 
  42     def stop(self):
  43         self.cancel = True
  44 
  45 class MeinFenster(Tkinter.Tk, threading.Thread):
  46     def __init__(self, q):
  47         Tkinter.Tk.__init__(self)
  48         threading.Thread.__init__(self)
  49 
  50         self.q = q
  51 
  52         self.frame = Tkinter.Frame(self, width = 200)
  53         self.frame.pack()
  54 
  55         self.label1 = Tkinter.Label(
  56             self,
  57             font = ("Arial", "14"),
  58             text = "Prozessorauslastung"
  59         )
  60         self.label1.pack(expand = True)
  61 
  62         self.label2 = Tkinter.Label(
  63             self,
  64             font = ("Arial", "12"),
  65             text = "[]"
  66         )
  67         self.label2.pack(expand = True)
  68 
  69     def run(self):
  70         pythoncom.CoInitialize()
  71         try:
  72             while True:
  73                 value = self.q.get()
  74                 if value == "quit":
  75                     break
  76                 else:
  77                     self.label2.config(text = value)
  78         finally:
  79             try:
  80                 pythoncom.CoUninitialize()
  81             except:
  82                 pass
  83 
  84     def stop(self):
  85         self.q.put("quit")
  86 
  87 def main():
  88     q = Queue.Queue()
  89 
  90     mf = MeinFenster(q)
  91     proc = MeinProzessor(q)
  92 
  93     mf.start()
  94     proc.start()
  95 
  96     mf.mainloop()
  97 
  98     proc.stop()
  99     mf.stop()
 100 
 101     print "Ende"
 102 
 103 if __name__ == "__main__":
 104     main()

Aus dem Forum, von gerold geschrieben.

CPU Anzeige (win32) (last edited 2009-06-17 16:14:14 by localhost)