我正在尝试显示/ proc / stat文件中的一些数据。由于此数据不断变化,我想在屏幕上的每个间隔(3秒)后更新值。如何使用poll()函数实现相同的功能?
编辑:我尝试使用线程和之后实现相同。但我对它在GUI上更新的方式不满意。下面是我的代码..
def displayTab1(self):
self.slabel1=ttk.Label(self.page1,text=" User Mode : ")
self.slabel1.grid(row=1,column=1,sticky=E,pady=15,padx=5)
self.slabel2=ttk.Label(self.page1,text=" System Mode : ")
self.slabel2.grid(row=2,column=1,sticky=E,pady=15,padx=5)
self.slabel3=ttk.Label(self.page1,text=" Total CPU utilization : ")
self.slabel3.grid(row=3,column=1,sticky=E,pady=15,padx=5)
self.slabel31=ttk.Label(self.page1,text="%")
self.slabel31.grid(row=3,column=3,sticky=N+W,pady=15,padx=5)
self.slabel4=ttk.Label(self.page1,text=" No: of Interrupts : ")
self.slabel4.grid(row=4,column=1,sticky=E,pady=15,padx=5)
self.slabel5=ttk.Label(self.page1,text=" Context Switches : ")
self.slabel5.grid(row=5,column=1,sticky=E,pady=15,padx=5)
self.slabel6=ttk.Label(self.page1,text=" Total Memory : ")
self.slabel6.grid(row=6,column=1,sticky=E,pady=15,padx=5)
self.slabel7=ttk.Label(self.page1,text=" Available Memory : ")
self.slabel7.grid(row=7,column=1,sticky=E,pady=15,padx=5)
self.slabel8=ttk.Label(self.page1,text=" Memory Utilization: ")
self.slabel8.grid(row=8,column=1,sticky=E,pady=15,padx=5)
self.book.grid()
t1 = threading.Thread(target=self.tab1_Layout, args = ())
t1.daemon = True
t1.start()
def tab1_Layout(self):
self.MemFile = open('/proc/meminfo','r').readlines()
for line in self.MemFile:
if line.startswith('MemTotal:'):
self.MemTotal = int(line.split()[1])
if line.startswith('MemAvailable:'):
self.MemAvail = int(line.split()[1])
break
MemTotal=self.MemTotal
MemAvail=self.MemAvail
VarS=System.SystemInfo(self.usr_prev,self.sys_prev,self.idle_prev)
self.usr_cur,self.sys_cur,self.idle_cur,usermode,sysmode,totalcpu,intr,ctxt,MemUtil= VarS.deltaTime()
self.usrmodeVal = ttk.Label(self.page1,text = usermode)
self.sysmodeVal = ttk.Label(self.page1,text = sysmode)
self.totcpuVal = ttk.Label(self.page1,text = totalcpu)
self.intrVal = ttk.Label(self.page1,text = intr)
self.ctxtVal = ttk.Label(self.page1,text = ctxt)
self.MemTotalVal = ttk.Label(self.page1,text = MemTotal)
self.MemAvailVal = ttk.Label(self.page1,text = MemAvail)
self.MemUtilVal = ttk.Label(self.page1,text = MemUtil)
self.usrmodeVal.grid(row=1,column=2,sticky=W+E+N+S,padx=5,pady=5)
self.sysmodeVal.grid(row=2,column=2,sticky=W+E+N+S,padx=5,pady=5)
self.totcpuVal.grid(row=3,column=2,sticky=W+E+N+S,padx=5,pady=5)
self.intrVal.grid(row=4,column=2,sticky=W+E+N+S,padx=5,pady=5)
self.ctxtVal.grid(row=5,column=2,sticky=W+E+N+S,padx=5,pady=5)
self.MemTotalVal.grid(row=6,column=2,sticky=W+E+N+S,padx=5,pady=5)
self.MemAvailVal.grid(row=7,column=2,sticky=W+E+N+S,padx=5,pady=5)
self.MemUtilVal.grid(row=8,column=2,sticky=W+E+N+S,padx=5,pady=5)
self.page1.after(I,self.tab1_Layout)
答案 0 :(得分:0)
您的代码的主要问题是您不断创建越来越多的小部件。不要那样做。创建一次小部件,然后更新它们。
您还遇到的问题是您正在使用线程,并尝试在多个线程中使用窗口小部件命令。 Tkinter不是线程安全的,并且在两个单独的线程中与小部件交互将产生不可预测的结果。
这是一个工作示例,虽然我删除了一堆小部件以使代码更容易掌握:
from Tkinter import *
import ttk
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.page1 = Frame(self)
self.page1.pack(fill="both", expand=True)
self.tab1_Layout()
self.tab1_Update()
def tab1_Update(self):
self.MemFile = open('/proc/meminfo','r').readlines()
self.MemTotal = self.MemAvail = 0
for line in self.MemFile:
if line.startswith('MemTotal:'):
self.MemTotal = int(line.split()[1])
if line.startswith('MemAvailable:'):
self.MemAvail = int(line.split()[1])
self.MemTotalVal.configure(text=self.MemTotal)
self.MemAvailVal.configure(text=self.MemAvail)
self.after(1000, self.tab1_Update)
def tab1_Layout(self):
self.MemTotalVal = ttk.Label(self.page1, width=10)
self.MemAvailVal = ttk.Label(self.page1, width=10)
self.MemTotalVal.grid(row=6,column=2,sticky=W+E+N+S,padx=5,pady=5)
self.MemAvailVal.grid(row=7,column=2,sticky=W+E+N+S,padx=5,pady=5)
if __name__ == "__main__":
root = Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()