【问题标题】:How to use poll in python 3如何在 python 3 中使用民意调查
【发布时间】:2015-10-09 18:28:16
【问题描述】:

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

【问题讨论】:

  • 无限循环,其中包含time.sleep
  • 你能举个例子吗?我试图获得相同的语法,但无法在谷歌上找到适合我的东西..
  • 向我们展示您尝试过的代码,我们会告诉您哪里出错了
  • 我想知道如何使用它。我以前使用过线程,后来也使用过,但对它在 GUI 上的方式不满意......
  • 再次,将您的代码添加到您的帖子中,以便我们向您展示如何修复它

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


【解决方案1】:

您的代码的主要问题是您不断创建越来越多的小部件。不要那样做。创建一次小部件,然后更新它们。

您还有一个问题是您正在使用线程,并尝试在多个线程中使用小部件命令。 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()

【讨论】:

  • 我尝试了你的方法,它的工作方式正是我想要的!万分感谢!尽管更新后的显示似乎很好,但是我无法显示 TEXT 字段。在我看来,该值被配置为显示在与标签的文本区域相同的位置(行/列)。我确信这很愚蠢,但我无法弄清楚......我能想到的唯一另一种方法是再次回到我的旧方法......请建议我该怎么做才能同时获得标签以及数据..
  • @Dee:我不明白你的问题。我不知道您所说的“文本字段”是什么意思。您的代码中没有任何标记为“TEXT”的内容,并且您没有任何文本小部件。如果您想要更多可见的东西,请添加更多小部件。此方法不限制您使用任何特定数量的小部件 - 添加所有您想要的。
  • 我的意思是标签的名称/文本不可见,因为标签和值都配置为同一行/列。因此,标签测试在屏幕上不可见。在我上面的例子中,对于 displayTab,我有几个......用户模式,系统模式,......等等。当我尝试在您的示例中进行配置时,文本丢失/覆盖。我想更新每个标签的值。
  • 我现在都明白了!非常感谢..但我仍然想知道如何使用 poll 代替 after。
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2021-11-15
  • 1970-01-01
  • 2022-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多