import tkinter as tk from tkinter import messagebox, ttk from tkcalendar import DateEntry import json import os from datetime import datetime, timedelta USERS_FILE = "users.json" TASKS_FILE = "tasks.json" # -------------------------- Работа с JSON -------------------------- def load_json(filename): if not os.path.exists(filename): return {} with open(filename, "r", encoding="utf-8") as f: return json.load(f) def save_json(filename, data): with open(filename, "w", encoding="utf-8") as f: json.dump(data, f, indent=4, ensure_ascii=False) # -------------------------- Окно регистрации -------------------------- class RegisterWindow: def __init__(self, root): self.root = root self.root.title("Регистрация") self.root.geometry("300x200") tk.Label(root, text="Логин").pack() self.login_entry = tk.Entry(root) self.login_entry.pack() tk.Label(root, text="Пароль").pack() self.password_entry = tk.Entry(root, show="*") self.password_entry.pack() tk.Button(root, text="Зарегистрироваться", command=self.register).pack(pady=10) tk.Button(root, text="У меня уже есть аккаунт", command=self.go_login).pack() def register(self): login = self.login_entry.get().strip() password = self.password_entry.get().strip() if not login or not password: messagebox.showwarning("Ошибка", "Введите логин и пароль.") return users = load_json(USERS_FILE) if login in users: messagebox.showerror("Ошибка", "Такой пользователь уже существует.") return users[login] = password save_json(USERS_FILE, users) messagebox.showinfo("Успех", "Регистрация выполнена.") self.go_login() def go_login(self): self.root.destroy() open_login_window() # -------------------------- Окно авторизации -------------------------- class LoginWindow: def __init__(self, root): self.root = root self.root.title("Авторизация") self.root.geometry("300x200") tk.Label(root, text="Логин").pack() self.login_entry = tk.Entry(root) self.login_entry.pack() tk.Label(root, text="Пароль").pack() self.password_entry = tk.Entry(root, show="*") self.password_entry.pack() tk.Button(root, text="Войти", command=self.login).pack(pady=10) tk.Button(root, text="Регистрация", command=self.go_register).pack() def login(self): login = self.login_entry.get().strip() password = self.password_entry.get().strip() users = load_json(USERS_FILE) if login in users and users[login] == password: messagebox.showinfo("Вход выполнен", "Добро пожаловать!") self.root.destroy() open_todo_window(login) else: messagebox.showerror("Ошибка", "Неверный логин или пароль.") def go_register(self): self.root.destroy() open_register_window() # -------------------------- To-Do приложение -------------------------- class TodoWindow: def __init__(self, root, username): self.root = root self.username = username self.root.title(f"Задачник — {username}") self.root.geometry("650x450") # --------------------- Ввод задачи --------------------- frame = tk.Frame(root) frame.pack(pady=10) tk.Label(frame, text="Задача:").grid(row=0, column=0) self.task_entry = tk.Entry(frame, width=40) self.task_entry.grid(row=0, column=1, padx=5) # Дата — через календарь tk.Label(frame, text="Дата:").grid(row=1, column=0) self.date_entry = DateEntry( frame, width=18, background="darkblue", foreground="white", date_pattern="yyyy-mm-dd" ) self.date_entry.grid(row=1, column=1, sticky="w") # Время — Spinbox tk.Label(frame, text="Время:").grid(row=2, column=0) time_frame = tk.Frame(frame) time_frame.grid(row=2, column=1, sticky="w") tk.Label(time_frame, text="Часы").grid(row=0, column=0) self.hour_spin = tk.Spinbox(time_frame, from_=0, to=23, width=5, format="%02.0f") self.hour_spin.grid(row=0, column=1, padx=3) tk.Label(time_frame, text="Минуты").grid(row=0, column=2) self.minute_spin = tk.Spinbox(time_frame, from_=0, to=59, width=5, format="%02.0f") self.minute_spin.grid(row=0, column=3, padx=3) # Кнопка добавить tk.Button(frame, text="Добавить задачу", command=self.add_task).grid( row=3, column=0, columnspan=2, pady=5 ) # --------------------- Таблица задач --------------------- columns = ("task", "deadline") self.table = ttk.Treeview(root, columns=columns, show="headings") self.table.heading("task", text="Задача") self.table.heading("deadline", text="Срок выполнения") self.table.pack(fill=tk.BOTH, expand=True) # Кнопка удалить tk.Button(root, text="Удалить выбранную задачу", command=self.delete_task).pack(pady=10) # Загрузка задач пользователя self.load_tasks() # Проверка дедлайнов каждые 30 сек self.check_deadlines() # --------------------- CRUD задачи --------------------- def load_tasks(self): self.table.delete(*self.table.get_children()) tasks = load_json(TASKS_FILE) user_tasks = tasks.get(self.username, []) for t in user_tasks: self.table.insert("", tk.END, values=(t["task"], t["deadline"])) def save_task(self, task_data): tasks = load_json(TASKS_FILE) if self.username not in tasks: tasks[self.username] = [] tasks[self.username].append(task_data) save_json(TASKS_FILE, tasks) def add_task(self): task = self.task_entry.get().strip() if not task: messagebox.showwarning("Ошибка", "Введите текст задачи.") return # Дата из календаря date = self.date_entry.get() # Время из Spinbox hour = self.hour_spin.get() minute = self.minute_spin.get() deadline = f"{date} {hour}:{minute}" # Проверим формат try: datetime.strptime(deadline, "%Y-%m-%d %H:%M") except ValueError: messagebox.showerror("Ошибка", "Неверный формат даты или времени.") return task_data = {"task": task, "deadline": deadline} self.save_task(task_data) self.load_tasks() self.task_entry.delete(0, tk.END) def delete_task(self): selected = self.table.selection() if not selected: return item = selected[0] task_text, deadline = self.table.item(item)["values"] tasks = load_json(TASKS_FILE) tasks[self.username] = [ t for t in tasks.get(self.username, []) if not (t["task"] == task_text and t["deadline"] == deadline) ] save_json(TASKS_FILE, tasks) self.table.delete(item) # --------------------- Проверка дедлайнов --------------------- def check_deadlines(self): now = datetime.now() for item in self.table.get_children(): task, deadline = self.table.item(item)["values"] dt = datetime.strptime(deadline, "%Y-%m-%d %H:%M") if dt < now: self.table.item(item, tags="expired") elif dt - now < timedelta(hours=1): self.table.item(item, tags="soon") else: self.table.item(item, tags="normal") self.table.tag_configure("expired", background="red") self.table.tag_configure("soon", background="yellow") self.table.tag_configure("normal", background="white") # Проверка каждые 30 секунд self.root.after(30000, self.check_deadlines) # -------------------------- Функции запуска окон -------------------------- def open_register_window(): root = tk.Tk() RegisterWindow(root) root.mainloop() def open_login_window(): root = tk.Tk() LoginWindow(root) root.mainloop() def open_todo_window(username): root = tk.Tk() TodoWindow(root, username) root.mainloop() # -------------------------- Старт -------------------------- open_login_window() Futurum

Робототехника Wedo

Курс Робототехника Wedo для детей 5-9 лет.

  • Улучшает моторику
  • Укрепляет память
  • Развивает логическое мышление
  • Формирует навыки работы в команде
  • Знакомит с основами программирования
  • Развивает творческое воображение
  • Учит доводить проект до результата

На каждом уроке дети собирают нового робота из конструктора LEGO WeDo: знакомятся с деталями, подключают моторы и датчики. Затем с помощью визуального программирования создают простые алгоритмы, чтобы оживить модель. В процессе ребёнок экспериментирует, пробует разные решения и видит результат своей работы. Уроки проходят в игровой форме, поэтому детям интересно учиться, а знания закрепляются легко и естественно.

Робототехника Алматы