Меня не устраивает моя скорость работы, поэтому я сделал угрожающий таймер
Автор: Антон ГудойВсем мой пламенный ку!
Столкнулся с проблемой того, что часто прокрастинирую и не пишу столько, сколько мог и хотел бы. В целом-то, проблема, знакомая, наверное, каждому, кроме тех, кто висит в топах АТ.
Решил просто: вспомнил про то, как мне хорошо работалось при наличии дедлайна. Но чтобы себя дополнительно подстегнуть, сделал себе таймер, который угрожающе ведет обратный отсчет на втором мониторе. Мини-приложение, которое просто показывает время, и все.
Работает на питоне, делать 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.
Особенно радует надпись, вылезающая при конце обратного отсчета.
