如何在python 3中使用poll

时间:2015-10-09 18:28:17

标签: python linux python-3.x tkinter epoll

我正在尝试显示/ 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)

1 个答案:

答案 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()