создание цифровых часов в python 3.7

#python #tkinter #clock

#python #tkinter #часы

Вопрос:

В общем, я пытаюсь создать цифровые часы на python, которые будут отображаться в маленьком окне при запуске программы. У меня было две идеи о том, как их создать, но приведенный ниже код тот же. Моя проблема в том, что если я использую time.sleep команду, при запуске программы окно даже не появляется, но если я использую root.after(1000, clock(root, w) , появляется окно, но оно создает 1000 меток, выдавая ошибку «превышена глубина рекурсии». Любая помощь?

 import time as t
import tkinter as tk

from datetime import datetime

def main():
    root = tk.Tk()
    root.title("Digital Clock")
    w = tk.Label(font = (100))
    w.pack()
    clock(root, w)
    root.mainloop()

def clock(root, w):
    t.sleep(1)
    timelabeled = " "
    now = datetime.now()
    timelabeled = ("%s/%s/%s   %s:%s:%s" % (now.day, now.month, now.year, now.hour, now.minute, now.second))

    w.config(text = timelabeled, )
    root.after(clock(root, w))   

if __name__ == "__main__":
    main()
  

Предполагается, что моим результатом будет небольшое окно с меткой, представляющей время, которое обновляется каждую секунду, но это не то, что я получаю. Либо я ничего не получаю, либо 1000 меток, которые не обновляются.

Комментарии:

1. Проблема с 1000 метками связана с тем, что вы работаете clock(root, w) внутри clock функции — бесконечная рекурсия.

Ответ №1:

Вы могли бы просто использовать root.after для повторения функции каждые 1 секунду. Режим ожидания не требуется.

 import tkinter as tk

from datetime import datetime

root = tk.Tk()
root.title("Digital Clock")

def clock():
    now = datetime.now()
    timelabeled = ("%s/%s/%s   %s:%s:%s" % (now.day, now.month, now.year, now.hour, now.minute, now.second))
    w.config(text = timelabeled, )
    root.after(1000,clock)

w = tk.Label(font = (100))
w.pack()
clock()
root.mainloop()
  

Комментарии:

1. так что, я думаю, моя проблема была с «основным». Как только я удалил «def main ()», как и в вашем коде, все работало безупречно. Можете ли вы объяснить, почему это произошло? Понятия не имею… Заранее спасибо!

2. это проблема области и не обязательно связана с tkinter. В принципе, вы не можете просто передавать локальные переменные вокруг разных функций — вам нужно объявить глобальные или вместо этого использовать ООП.

Ответ №2:

Это просто простые часы, использующие модуль Tkinter для просмотра программного обеспечения:

 from tkinter import *
from time import strftime

root=Tk()
root.title("clock")

def time():
    string=strftime("%H: %M: %S: %p")
    label.configure(text=string)
    label.after(1000, time) 

label=Label(root, font=("Arial Black", 40),bg="black", fg="white")
label.pack(anchor="center")


time()
root.mainloop()