Меня не устраивает моя скорость работы, поэтому я сделал угрожающий таймер

Автор: Антон Гудой

Всем мой пламенный ку!

Столкнулся с проблемой того, что часто прокрастинирую и не пишу столько, сколько мог и хотел бы. В целом-то, проблема, знакомая, наверное, каждому, кроме тех, кто висит в топах АТ.

Решил просто: вспомнил про то, как мне хорошо работалось при наличии дедлайна. Но чтобы себя дополнительно подстегнуть, сделал себе таймер, который угрожающе ведет обратный отсчет на втором мониторе. Мини-приложение, которое просто показывает время, и все.

Работает на питоне, делать exe-шник лень. Для того, чтобы работало, скачайте python 3.14 версии. Затем создаете в удобной директории папку CountdownTimer. В ней нужно создать файл блокнота с названием timer. Затем туда тупо копируем код:

import tkinter as tk
from tkinter import simpledialog
from datetime import datetime
from screeninfo import get_monitors
import json
import os

CONFIG_FILE = "timer_config.json"

fullscreen = False
saved_geometry = None


def load_config():
if os.path.exists(CONFIG_FILE):
try:
with open(CONFIG_FILE, "r", encoding="utf-8") as f:
return json.load(f)
except:
pass

return {}


def save_config():
config = {}

if target_time:
config["target"] = target_time.isoformat()

config["fullscreen"] = fullscreen

try:
config["geometry"] = root.geometry()
except:
pass

with open(CONFIG_FILE, "w", encoding="utf-8") as f:
json.dump(config, f, indent=4)


config = load_config()

target_time = None

if "target" in config:
try:
target_time = datetime.fromisoformat(config["target"])
except:
pass


def set_time():
global target_time

value = simpledialog.askstring(
"Установка времени",
"Введите дату и время:\nГГГГ-ММ-ДД ЧЧ:ММ:СС"
)

if not value:
return

try:
target_time = datetime.strptime(
value,
"%Y-%m-%d %H:%M:%S"
)

save_config()

except:
pass


def get_current_monitor():
center_x = root.winfo_x() + root.winfo_width() // 2
center_y = root.winfo_y() + root.winfo_height() // 2

for monitor in get_monitors():
if (
monitor.x <= center_x < monitor.x + monitor.width
and
monitor.y <= center_y < monitor.y + monitor.height
):
return monitor

return get_monitors()[0]


def enter_fullscreen():
global fullscreen
global saved_geometry

if fullscreen:
return

saved_geometry = root.geometry()

monitor = get_current_monitor()

root.overrideredirect(True)

# Скрываем кнопку в полноэкранном режиме
button.pack_forget()

root.geometry(
f"{monitor.width}x{monitor.height}"
f"+{monitor.x}+{monitor.y}"
)

fullscreen = True


def leave_fullscreen():
global fullscreen

if not fullscreen:
return

root.overrideredirect(False)

# Возвращаем кнопку
button.pack(pady=20)

if saved_geometry:
root.geometry(saved_geometry)

fullscreen = False


def toggle_fullscreen(event=None):
if fullscreen:
leave_fullscreen()
else:
enter_fullscreen()


def update_timer():
if target_time:
now = datetime.now()
delta = target_time - now

if delta.total_seconds() > 0:
total = int(delta.total_seconds())

days = total // 86400
hours = (total % 86400) // 3600
minutes = (total % 3600) // 60
seconds = total % 60

label.config(
text=f"{days} дн\n{hours:02}:{minutes:02}:{seconds:02}"
)
else:
label.config(text="ВРЕМЯ\nНАСТАЛО")
else:
label.config(text="ТАЙМЕР\nНЕ НАСТРОЕН")

root.after(1000, update_timer)


def on_close():
save_config()
root.destroy()


root = tk.Tk()

root.title("Countdown Timer")
root.configure(bg="black")

geometry = config.get("geometry")

if geometry:
root.geometry(geometry)
else:
root.geometry("1200x700")

label = tk.Label(
root,
text="",
fg="white",
bg="black",
font=("Consolas", 80, "bold")
)

label.pack(expand=True)

button = tk.Button(
root,
text="Установить время",
command=set_time,
font=("Arial", 14)
)

button.pack(pady=20)

root.bind("<F11>", toggle_fullscreen)
root.bind("<Escape>", lambda e: leave_fullscreen())

root.protocol("WM_DELETE_WINDOW", on_close)

update_timer()

root.after(
300,
lambda: enter_fullscreen()
if config.get("fullscreen", False)
else None
)

root.mainloop()

Прямо в блокноте нажимаем "Сохранить как" -> "Все типы файлов", название ставим timer.pyw

Все, готово. Запускаете и радуетесь. f11 позволяет открыть приложение на весь экран, esc его закрывает. Фуллскрин особенно удобен при наличии второго монитора.

Чтобы запускалось при включении компьютера, делаем следующие действия:

win+r, shell:startup. Откроется папка, в которую нужно вставить ярлык на pyw-файл из папки с таймером. Все, вы великолепны.


P.S.

Особенно радует надпись, вылезающая при конце обратного отсчета.

+9
154

0 комментариев, по

1 180 871 10
Мероприятия

Список действующих конкурсов, марафонов и игр, организованных пользователями Author.Today.

Хотите добавить сюда ещё одну ссылку? Напишите об этом администрации.

Наверх Вниз