且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Python tkinter 时钟的白天主题和夜晚主题

更新时间:2022-12-27 19:30:03

使用您提供的代码,我移动了一些东西并更新了 tick() 函数以检查当前时间状态.

Taking the code you provided I moved some things around and update the tick() function to check the current time status.

通过添加跟踪变量来查看我们是否已经为当天设置了主题,我们可以防止程序每隔几秒重新应用主题,并且每天只应用一次.

By adding a tracking variable to see if we have already set a theme for the day we can prevent the program from reapplying the theme ever seconds and just apply once per day.

如果你翻转这条线:

if time_now.tm_hour >= dark[time_now.tm_mon] or time_now.tm_hour < light[time_now.tm_mon]:

为此:

if time_now.tm_hour <= dark[time_now.tm_mon] or time_now.tm_hour > light[time_now.tm_mon]:

您可以进行效果测试以确保夜间主题有效,这样您就不必等待一整天.

You can in affect test to make sure the night theme works so you don't have to wait all day.

我还更改了 after() 语句以在 1 秒后刷新时钟,因为每秒更新时钟 5 次毫无意义.

I have also changed the after() statement to refresh the clock after 1 second as there is no point in updating the clock 5 times a second.

看看下面的代码,如果你有任何问题,请告诉我.

Take a look at the below code and let me know if you have any questions.

import Tkinter as tk
import time

dark = {1:16, 2:17, 3:18, 4:19, 5:19, 6:20, 7:20, 8:19, 9:18, 10:17, 11:16, 12:16}
#month_number : sunrise_hour
light = {1:8, 2:7, 3:6, 4:5, 5:4, 6:4, 7:4, 8:5, 9:6, 10:6, 11:7, 12:8}

root = tk.Tk()
time1 = ''
clock = tk.Label(root, font=('calibri', 20, 'bold'))
clock.pack(fill=tk.BOTH, expand=1)
current_theme = "not set"

def theme_updater(theme_bg, theme_fg):
    clock.config(bg=theme_bg, fg=theme_fg)

def tick():
    global time1, clock, current_theme
    time2 = time.strftime('%H:%M:%S')

    if time2 != time1:
        time1 = time2
        clock.config(text=time2)

    time_now = time.localtime()
    if time_now.tm_hour >= dark[time_now.tm_mon] or time_now.tm_hour < light[time_now.tm_mon]:
        if current_theme != "night":
            theme_updater("black", "white")
            current_theme = "night"
            print('Night time theme set.')
    else:
        if current_theme != "day":
            theme_updater("white", "black")
            current_theme = "day"
            print('Day time theme set.')
    clock.after(1000, tick)

tick()
root.mainloop()

更新:

根据您更新的问题,我已将您的代码改写为 OOP.我无法重现您的错误,但有些事情看起来需要更改.例如,您在 tkinter 中使用 sleep ,这将导致您的程序冻结.我们可以使用 after 代替.

Based on your updated question I have reworked your code into OOP. I was unable to reproduce your error however some things look like they needed changing. For example you were using sleep in tkinter and that will cause your program to freeze. We can use after instead.

我删除了 rss 提要部分,因为它与测试无关.

I removed the rss feed part as it was not relevant for testing.

看看下面的例子,如果有帮助,请告诉我.

Take a look at the below example and let me know if it helps.

import tkinter as tk
from time import strftime
import time


class MyApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.dark = {1:16, 2:17, 3:18, 4:19, 5:19, 6:20, 7:20, 8:19, 9:18, 10:17, 11:16, 12:16}
        self.light = {1:8, 2:7, 3:6, 4:5, 5:4, 6:4, 7:4, 8:5, 9:6, 10:6, 11:7, 12:8}
        self.current_theme = "not set"
        self.time1 = ''
        self.extra_time1 = ''
        self.clock = tk.Label(self, font=('calibri light', 150))
        self.clock.pack(fill=tk.BOTH, expand=1)
        self.extra_clock = tk.Label(self, font=('calibri light', 45))
        self.extra_clock.pack(fill=tk.BOTH, expand=1)
        self.label_rss = tk.Label(self, font=('calibri', 14))
        self.label_rss.pack(fill=tk.BOTH)
        self.end = tk.Button(self, text="Exit", font=('bold', 18), bd=0, borderwidth=0, highlightthickness=0, command=self.exitt, height=0, width=0)
        self.end.pack(fill=tk.BOTH)
        self.w, self.h = self.winfo_screenwidth(), self.winfo_screenheight()
        self.overrideredirect(1)
        self.geometry("%dx%d+0+0" % (self.w, self.h))
        self.focus_set()
        self.tick()
        self.ticki()

    def exitt(self):
        self.after(3000, self.destroy)

    def theme_updater(self, theme_bg, theme_fg):
        self.clock.config(bg=theme_bg, fg=theme_fg)
        self.extra_clock.config(bg=theme_bg, fg=theme_fg)
        self.label_rss.config(bg=theme_bg, fg=theme_fg)
        self.end.config(fg=theme_fg, bg=theme_bg)

    def tick(self):
        time2 = strftime("%H:%M:%S")
        if time2 != self.time1:
            self.time1 = time2
            self.clock.config(text=time2)
        time_now = time.localtime()
        if time_now.tm_hour >= self.dark[time_now.tm_mon] or time_now.tm_hour < self.light[time_now.tm_mon]:
            if self.current_theme != "night":
                self.theme_updater("black", "white")
                self.current_theme = "night"
                print('Night time theme set.')
        else:
            if self.current_theme != "day":
                self.theme_updater("white", "black")
                self.current_theme = "day"
                print('Day time theme set.')
        self.clock.after(1000, self.tick)

    def ticki(self):
        extra_time2 = strftime("%A, %d %B %Y")
        if extra_time2 != self.extra_time1:
            self.extra_time1 = extra_time2
            self.extra_clock.config(text=extra_time2)
        self.extra_clock.after(1000, self.ticki)

app = MyApp()
app.mainloop()