2015-04-24 3 views
-1

У меня есть сценарий BASH, который открывает программу (tshark), которая записывает кучу значений в файл журнала. Затем скрипт подсчитывает уникальные значения и записывает (подсчет) значений uniques из последних 3 минут в файл журнала (count3m.log). Он также открывает скрипт python. Питон должен показать окно со значениями из count3m.log. Поскольку значение в count3m.log изменяется каждые 30 секунд, я хочу продолжать искать новое значение из count3m. Я попробовал это с помощью кода ниже. Он выполняет цикл только один раз. Что я делаю не так?Пока цикл не работает при использовании Tkinter

#!/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() 
+3

Когда ваш код получает 'root.mainloop()' это "по существу" останавливается. 'root.mainloop()' запускает Tkinter, и в этот момент ваша программа полностью ждет события, а не продолжения запуска кода. – Jkdc

+0

Что такое 'root.mainloop()'? Я думаю, что это может повесить вашу петлю (бесконечный цикл внутри бесконечного цикла). – m0dem

ответ

2

Реферирования этого answer

MainLoop действительно ничего больше, чем бесконечный цикл, который выглядит примерно так (это не те фактические имена методов, имена служат лишь для иллюстрации того,):

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

Итак, у вас есть бесконечный цикл внутри вашего цикла.

Чтобы обновить ярлык, вам необходимо прикрепить событие к вашему корню. Кроме того, установите для вашего ярлыка textvariable = a 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?

+0

Потребовалось некоторое внимание к другим темам, но, наконец, это заработало. Спасибо за помощь – Mars