首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有的数字时钟

带有的数字时钟
EN

Code Review用户
提问于 2021-06-22 21:43:26
回答 1查看 699关注 0票数 7

在学习python的同时,我决定制作一个数字时钟:

代码语言:javascript
复制
from datetime import datetime
import tkinter as tk
from threading import Thread
import time


class clock():
     def __init__(self):
          self.display = tk.Tk()
     def start(self):
          def get():
               self.display.geometry("215x62")
               self.display.title("Clock")
               while True:
                    try:
                         now = datetime.now()
                         current_time = now.strftime("%H:%M %p") 
                         lbl = tk.Label(self.display, text=str(current_time),
                         background = 'black', font = ("Helvetica", 37),
                         foreground = 'red')
                         lbl.place(x=0, y=0)
                         time.sleep(0.1)
                    except:
                         break
          receive_thread = Thread(target=get)
          receive_thread.start()
          self.display.mainloop()
clock = clock()
clock.start()

有什么办法让这个钟更好吗?

任何评论,答案,或在正确的方向上的步骤,将不胜感激。

EN

回答 1

Code Review用户

回答已采纳

发布于 2021-06-22 23:35:52

首先,停止每秒钟10次创建一个全新的标签是至关重要的。只需修改现有的。而且,这是如此简单,不需要一个类。尽可能远离你的线程,进入你的设置程序。最后,考虑到您还包括了%H,您对%p的使用可能是不正确的;您可能需要一个12小时时钟的%I

所有这些都表明:

代码语言:javascript
复制
from datetime import datetime
import tkinter as tk
from threading import Thread
from time import sleep


def main():
    display = tk.Tk()
    display.geometry('215x62')
    display.title('Clock')

    lbl = tk.Label(
        display,
        background='black',
        font=('Helvetica', 37),
        foreground='red',
    )
    lbl.place(x=0, y=0)

    def get():
        while True:
            now = datetime.now()
            lbl.config(text=now.strftime('%I:%M %p'))
            sleep(0.1)

    receive_thread = Thread(target=get)
    receive_thread.start()
    display.mainloop()


if __name__ == '__main__':
    main()

每秒十次都是过度消耗,你可以安全地让这更多的睡眠。根本不要制作线程;使用after()计时器,并计算时钟应该在什么时候滴答:

代码语言:javascript
复制
from datetime import datetime
import tkinter as tk
from time import time


def main() -> None:
    display = tk.Tk()
    display.geometry('215x62')
    display.title('Clock')

    lbl = tk.Label(
        display,
        background='black',
        font=('Helvetica', 37),
        foreground='red',
    )
    lbl.place(x=0, y=0)

    def tick() -> None:
        now = datetime.now()
        lbl.config(text=now.strftime('%I:%M %p'))

        until_next = round(
            1000 * (60 - time()%60)
        )
        display.after(ms=until_next, func=tick)

    tick()
    display.mainloop()


if __name__ == '__main__':
    main()
票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/263346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档