虽然使用Tkinter时循环不起作用

时间:2015-04-24 13:43:58

标签: python bash tkinter tshark

我运行了一个BASH脚本,它打开一个程序(tshark),它将一堆值写入日志文件。然后,该脚本对唯一值进行计数,并将最近3分钟的唯一值(的计数)写入日志文件(count3m.log)。它还会打开一个python脚本。 python用于显示一个带有count3m.log值的窗口。由于count3m.log中的值每30秒更改一次,我想继续从count3m中查找新值。我尝试使用下面的代码。它只执行一次循环。我做错了什么?

#!/usr/bin/env python

import sys
import re
import time
from Tkinter import *

while True:  

    root = Tk()
    count3m = open('count3m.log','r')
    countStart = open('countStart.log','r')


    minutes = Label(root, text="Uniq signals < 3m ago:")
    minutes.grid(row=0, column=0)

    minutes = Label(root, text=count3m.read())
    minutes.grid(row=1, column=0)
    count3m.close

    minutes = Label(root, text="Uniq signals since start:")
    minutes.grid(row=0, column=1)

    minutes = Label(root, text=countStart.read())
    minutes.grid(row=1, column=1)
    countStart.close
    time.sleep(5)
    print "test"
    root.mainloop()

1 个答案:

答案 0 :(得分:2)

引用此answer

  

mainloop实际上只是一个看起来大致如此的无限循环(那些不是方法的实际名称,这些名称只是用来说明这一点):

while True:
    event=wait_for_event()
    event.process()
    if main_window_has_been_destroyed(): 
        break

所以,你的循环中有一个无限循环。

要更新标签,您需要将事件附加到根目录。另外,设置标签&text;文本变量= StringVar。然后,更新事件中的StringVar,它将更改标签。

像这样的东西

text  = StringVar()
label = Label(root, textvariable=text).pack()

def update_label():
  text.set("new stuff")
  #update again
  root.after(SOME_TIME, update_label)

#the first update
root.after(SOME_TIME, update_label)
root.mainloop()

这应该给你基本的想法。关联堆栈溢出问题:

Making python/tkinter label widget update?

Python: Is it possible to create an tkinter label which has a dynamic string when a function is running in background?