Дневная тема и ночная тема для часов Python tkinter

2

Я занимаюсь созданием часов для использования 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()

Это то, что происходит в дневной теме в моем полном коде: Изображение 174551 И на ночной теме: Изображение 174551

  • 0
    В настоящее время у меня есть программа, которая имеет выбираемые темы, и каждая тема применяется с простым вызовом функции. Я думаю, что если вы настроите свои темы как функцию, вы сможете проверить время суток, а затем также убедиться, что конкретная тема еще не применена. Это позволит вашей программе применять тему автоматически и только один раз за смену времени.
Теги:
tkinter

1 ответ

3
Лучший ответ

Принимая код, который вы предоставили, я переместил некоторые вещи и 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()
  • 0
    Так что в моем полном коде, используя это, работает только ночная тема. Дневная тема работает нормально с датой и кнопкой подачи и выхода rss, но временные цвета перепутаны, двоеточие черное, а цифры белые
  • 0
    Мой ответ - всего лишь пример того, как вы бы настроили синхронизированную тему. Вам нужно будет выбрать виджеты, которые будут меняться при каждом обновлении темы. При этом аргументы fg=set_txt и bg=set_bg ничего не значат в вашем примере, поскольку вы нигде не определяете set_text или set_bg. Имейте в виду, что если вы используете какой-либо тип StringVar, это не изменит ваш bg или fg при изменении этого StringVar.
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню