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.