Я занимаюсь созданием часов для использования python tkinter. Мне удалось это сделать и хотелось бы перейти на следующий уровень: автоматическая дневная/ночная смена темы. Я попытался использовать strftime и свой собственный код для получения приблизительной оценки, будь то день или ночь. код всегда дал бы мне неправильный цвет для чисел, но правильный цвет для двоеточий.
Иногда это работает только на этом часовом коде, но не работает с моим полным кодом.
Вот мой полный код:
#!/usr/bin/env python
import sys
if sys.version_info[0] == 2:
import Tkinter as tk
else:
import tkinter as tk
from time import sleep, strftime
import datetime
import feedparser
import time
from itertools import cycle
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()
current_theme = "not set"
d = feedparser.parse('https://www.reddit.com/r/news/.rss')
post_list = cycle(d.entries)
def exitt():
sleep(3)
root.destroy()
def theme_updater(theme_bg, theme_fg):
clock.config(bg=theme_bg, fg=theme_fg)
extra_clock.config(bg=theme_bg, fg=theme_fg)
label_rss.config(bg=theme_bg, fg=theme_fg)
end.config(fg=theme_fg, bg=theme_bg)
time1 = ''
extra_time1 = ''
clock = tk.Label(root, font=('calibri light', 150))
clock.pack(fill=tk.BOTH, expand=1)
extra_clock = tk.Label(root, font=('calibri light', 45))
extra_clock.pack(fill=tk.BOTH, expand=1)
label_rss = tk.Label(root, font=('calibri', 14))
label_rss.pack(fill=tk.BOTH)
end = tk.Button(root, text="Exit", font=('bold', 18), bd=0, borderwidth=0, highlightthickness=0, command=lambda:exitt(), height=0, width=0)
end.pack(fill=tk.BOTH)
def rssfeeds():
post = next(post_list)
RSSFEED = post.title
modTXT = 'r/news Feed: ' + RSSFEED
label_rss.config(text=modTXT)
root.after(8000, rssfeeds)
rssfeeds()
def tick():
global current_theme
global time1
time2 = 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)
def ticki():
global extra_time1
extra_time2 = strftime("%A, %d %B %Y")
if extra_time2 != extra_time1:
extra_time1 = extra_time2
extra_clock.config(text=extra_time2)
extra_clock.after(1000, ticki)
tick()
ticki()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.overrideredirect(1)
root.geometry("%dx%d+0+0" % (w, h))
root.focus_set()
root.mainloop()
Это то, что происходит в дневной теме в моем полном коде: И на ночной теме:
Принимая код, который вы предоставили, я переместил некоторые вещи и tick()
функцию tick()
чтобы проверить текущий статус времени.
Добавив переменную отслеживания, чтобы увидеть, если мы уже установили тему в течение дня, мы можем помешать программе повторно использовать тему за считанные секунды и применять ее только один раз в день.
Если вы перевернете эту строку:
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]:
Вы можете повлиять на тест, чтобы убедиться, что ночная тема работает, поэтому вам не нужно ждать весь день.
Я также изменил инструкцию after()
чтобы обновить часы через 1 секунду, так как нет необходимости в обновлении тактового сигнала 5 раз в секунду.
Взгляните на приведенный ниже код и сообщите мне, есть ли у вас какие-либо вопросы.
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()
ОБНОВИТЬ:
Основываясь на вашем обновленном вопросе, я переработал ваш код в ООП. Я не смог воспроизвести вашу ошибку, однако некоторые вещи выглядят так, как будто они нуждаются в изменении. Например, вы использовали sleep
в tkinter, и это приведет к зависанию вашей программы. Мы можем использовать after
того, как вместо.
Я удалил часть rss-канала, поскольку это не было актуально для тестирования.
Взгляните на приведенный ниже пример и дайте мне знать, если это поможет.
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()
fg=set_txt
и bg=set_bg
ничего не значат в вашем примере, поскольку вы нигде не определяете set_text или set_bg. Имейте в виду, что если вы используете какой-либо тип StringVar, это не изменит ваш bg или fg при изменении этого StringVar.