Пока цикл не работает при использовании Tkinter

У меня запущен скрипт BASH, который открывает программу (tshark), которая записывает набор значений в лог-файл. Затем сценарий подсчитывает уникальные значения и записывает (количество) уникальных значений за последние 3 минуты в файл журнала (count3m.log). Он также открывает сценарий 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()

person Mars    schedule 24.04.2015    source источник
comment
Когда ваш код достигает root.mainloop(), он практически останавливается. root.mainloop() создает экземпляр Tkinter, и в этот момент ваша программа полностью ожидает возникновения события, не продолжая выполнять код.   -  person MrAlexBailey    schedule 24.04.2015
comment
Что такое root.mainloop()? Я думаю, что это может быть зависание вашего цикла (бесконечный цикл внутри бесконечного цикла).   -  person m0dem    schedule 24.04.2015


Ответы (1)


Ссылка на этот ответ

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

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

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

Чтобы обновить ярлык, вам нужно прикрепить событие к корневому каталогу. Кроме того, установите текстовую переменную вашей метки = StringVar. Затем обновите StringVar в событии, и оно изменит метку.

Что-то вроде этого

text  = StringVar()
label = Label(root, textvariable=text)
label.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()

Это должно дать вам основную идею. Связать вопросы о переполнении стека:

Обновить виджет метки python/tkinter?

Python: Можно ли создать метку tkinter с динамической строкой, когда функция работает в фоновом режиме?

person Richard Kelly    schedule 24.04.2015
comment
Потребовалось некоторое рассмотрение других тем, но, наконец, это сработало. Спасибо за помощь - person Mars; 28.04.2015