Конвертор секунд в тики!

Я сделал конвертер для мододелов. Теперь преобразование времени между секундами и тиками стало проще и удобнее. Моё приложение предлагает быструю и точную конвертацию временных значений с помощью простого и интуитивно понятного интерфейса. Попробуйте сейчас и оптимизируйте свою работу с модами! Предлагайте свои идеи, что изменить, а что добавить, чтобы сделать это приложение ещё лучше.
Скачать здесь
 
Исходный код просьба опубликовать.
Python:
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import requests
from io import BytesIO
import gettext

TICKS_PER_SECOND = 20

def seconds_to_ticks(seconds):
    return seconds * TICKS_PER_SECOND

def ticks_to_seconds(ticks):
    return ticks / TICKS_PER_SECOND

def convert():
    if entry.get() in placeholders.values() or entry.get() == "":
        result_label.config(text=f"Введите значение в поле '{placeholders[conversion_mode.get()]}'")
    else:
        try:
            input_value = float(entry.get())
            if conversion_mode.get() == "Секунды в Тики":
                result = seconds_to_ticks(input_value)
            else:
                result = ticks_to_seconds(input_value)
            result_label.config(text=f"Результат: {result}")
        except ValueError:
            result_label.config(text="Некорректное число")

def clear_placeholder(event):
    if entry.get() in placeholders.values():
        entry.delete(0, tk.END)
        entry.config(foreground="black")

def restore_placeholder(event):
    if entry.get() == "":
        entry.insert(0, placeholders[conversion_mode.get()])
        entry.config(foreground="gray")

def update_placeholder(*args):
    entry.delete(0, tk.END)
    entry.insert(0, placeholders[conversion_mode.get()])
    entry.config(foreground="gray")
    result_label.config(text="Результат:")

def handle_enter(event):
    convert()

root = tk.Tk()
root.title("Конвертер секунд в тики")
root.geometry("1000x700")
root.update_idletasks()
width = root.winfo_width()
height = root.winfo_height()
x = (root.winfo_screenwidth() // 2) - (width // 2)
y = (root.winfo_screenheight() // 2) - (height // 2)
root.geometry('{}x{}+{}+{}'.format(width, height, x, y))

url = "https://wallbox.ru/resize/1920x1200/wallpapers/main/201431/aadf9426876139a.jpg"
response = requests.get(url)
bg_image = Image.open(BytesIO(response.content))
bg_image = bg_image.resize((width, height), Image.LANCZOS)
bg_photo = ImageTk.PhotoImage(bg_image)

canvas = tk.Canvas(root, width=width, height=height)
canvas.pack(fill="both", expand=True)
canvas.create_image(0, 0, image=bg_photo, anchor="nw")

lang = "ru"
trans = gettext.translation('strings', localedir='./locale', languages=[lang], fallback=True)
trans.install()

style = ttk.Style()
style.configure("TEntry", background="white", fieldbackground="white", borderwidth=0, relief="flat")
style.configure("TLabel", background="white", font=("Times New Roman", 20), borderwidth=0, relief="flat")
style.configure("TRadiobutton", background="white", font=("Times New Roman", 20), borderwidth=0, relief="flat")
style.configure("TButton", background="white", font=("Times New Roman", 20), borderwidth=0, relief="flat")

placeholders = {
    "Секунды в Тики": "Введите секунды",
    "Тики в Секунды": "Введите тики"
}
conversion_mode = tk.StringVar(value="Секунды в Тики")
conversion_mode.trace_add("write", update_placeholder)

entry = ttk.Entry(canvas, font=("Times New Roman", 20), style="TEntry", foreground="gray")
entry.insert(0, placeholders[conversion_mode.get()])
entry.bind("<FocusIn>", clear_placeholder)
entry.bind("<FocusOut>", restore_placeholder)
entry.bind("<Return>", handle_enter)
entry_window = canvas.create_window(width//2, height//2 - 60, window=entry, anchor="center")

radiobutton1 = ttk.Radiobutton(canvas, text="Секунды в Тики", variable=conversion_mode, value="Секунды в Тики", style="TRadiobutton")
radiobutton2 = ttk.Radiobutton(canvas, text="Тики в Секунды", variable=conversion_mode, value="Тики в Секунды", style="TRadiobutton")
radiobutton1_window = canvas.create_window(width//2, height//2 - 20, window=radiobutton1, anchor="center")
radiobutton2_window = canvas.create_window(width//2, height//2 + 20, window=radiobutton2, anchor="center")

convert_button = ttk.Button(canvas, text="Конвертировать", style="TButton", command=convert, width=20)
convert_button_window = canvas.create_window(width//2, height//2 + 60, window=convert_button, anchor="center")

result_label = ttk.Label(canvas, text="Результат: ", style="TLabel")
result_label_window = canvas.create_window(width//2, height//2 + 100, window=result_label, anchor="center")

root.mainloop()
 
1,427
125
254
Мне другие временные измерения добавить?
Серверные тики непостоянны и меняются в зависимости от нагрузки. А ещё их можно изменить при помощи gamerule.

Это для тех кому лень
Всё ещё очень сомнительное решение. Проще в коде прописать: 60 * 20, нежели заходить в твою прогу и чепатать 60, чтобы получить 1200.
 
1,099
74
387
Гениальное решение тянуть картинку с интернета. А если нет интернета или сайт накроется медным тазом? Ждать пока оно отвалится по тайм-ауту?

Проще всего в калькуляторе посчитать, хотя в уме умножить на два десятка быстрее выйдет. Проще всего прямо в коде записать формулой, для читаемости кода это лучше будет.
Кому нужны секунды - те используют планировщик, привязанный к часам, дабы лаги сервера не вносили свои коррективы. Клиент тоже лагает (низкий FPS). Не помню с какой там версии майна рендерер и тики разнесли по разным потокам...

Так для чего нужна данная поделка?
 
Последнее редактирование:
Сверху