Если вы представляете, что ваша программа работает сверху вниз, вы никогда не достигнете той части, где вы создаете объект Tk
, StringVar
и Label
;поскольку он застревает в бесконечном цикле while
.Ошибка, которую вы получаете, заключается в том, что когда вы звоните test
, timee
еще не определено.
Проще говоря, ваша программа может делать только одно за раз.Когда он занят работой часов, он не может создавать окна TKinter.OTOH, когда он управляет окном tkinter (функция .mainloop
), он не может обновить ваши часы.
Вам нужно получить оба, чтобы хорошо играть друг с другом.Для объекта Tkinter существует специальный метод, который сообщает ему, что вы хотите что-то сделать: after
.(См. Документы по виджетам tkinter ):
import time
from tkinter import *
def test():
seconds = time.time()
local_time = time.ctime(seconds)
timee.set('The Time Is: ' + local_time)
# after updating, schedule next call in 1 second
root.after(1000, test)
root = Tk()
timee = StringVar()
l = Label(root, textvariable=timee)
l.pack(side=TOP)
# Before starting up, instruct Tkinter to run test after 1 second
root.after(1000, test)
root.mainloop()
Как видите, явного вызова test()
больше нет.Вместо этого в after()
тестовая функция передается как переменная.Вы можете подумать о том, чтобы передать after()
список инструкций без их выполнения.
Затем, когда tkinter запускает свое окно (вызов .mainloop()
), он просматривает свой список действий.и найдет test
звонок, который вы заказали.В нужный момент он вызовет функцию test
один раз;затем в конце функции запланирован следующий вызов.