/
hook95
/
Edilov
Обзор
Документация
Войти
/
hook95
/
Edilov
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
new_file
170 строк
7 KB
hook95
create: new_file
13 май 2026, 22:33
Верифицирован
13 май 2026, 22:33
7806223
Код
Авторство
О чём код?
import json import os from tkinter import * from tkinter import ttk, messagebox class MovieLibrary: def __init__(self, root): self.root = root self.root.title("Movie Library - Личная кинотека") self.root.geometry("900x500") self.movies = [] self.data_file = "movies.json" # Загрузка данных из JSON self.load_data() # Создание интерфейса self.create_widgets() # Обновление таблицы self.refresh_table() def create_widgets(self): # ===== Форма ввода ===== input_frame = LabelFrame(self.root, text="Информация о фильме", padx=10, pady=10) input_frame.pack(pady=10, padx=10, fill="x") Label(input_frame, text="Название:").grid(row=0, column=0, sticky="w", pady=2) self.title_entry = Entry(input_frame, width=30) self.title_entry.grid(row=0, column=1, pady=2) Label(input_frame, text="Жанр:").grid(row=1, column=0, sticky="w", pady=2) self.genre_entry = Entry(input_frame, width=30) self.genre_entry.grid(row=1, column=1, pady=2) Label(input_frame, text="Год выпуска:").grid(row=2, column=0, sticky="w", pady=2) self.year_entry = Entry(input_frame, width=30) self.year_entry.grid(row=2, column=1, pady=2) Label(input_frame, text="Рейтинг (0-10):").grid(row=3, column=0, sticky="w", pady=2) self.rating_entry = Entry(input_frame, width=30) self.rating_entry.grid(row=3, column=1, pady=2) add_btn = Button(input_frame, text="Добавить фильм", command=self.add_movie, bg="green", fg="white") add_btn.grid(row=4, column=0, columnspan=2, pady=10) # ===== Фильтры ===== filter_frame = LabelFrame(self.root, text="Фильтрация", padx=10, pady=10) filter_frame.pack(pady=5, padx=10, fill="x") Label(filter_frame, text="Фильтр по жанру:").grid(row=0, column=0, padx=5) self.genre_filter = Entry(filter_frame, width=20) self.genre_filter.grid(row=0, column=1, padx=5) Button(filter_frame, text="Применить", command=self.filter_movies).grid(row=0, column=2, padx=5) Label(filter_frame, text="Фильтр по году:").grid(row=1, column=0, padx=5) self.year_filter = Entry(filter_frame, width=20) self.year_filter.grid(row=1, column=1, padx=5) Button(filter_frame, text="Применить", command=self.filter_movies).grid(row=1, column=2, padx=5) Button(filter_frame, text="Сбросить фильтры", command=self.reset_filters, bg="gray", fg="white").grid(row=2, column=0, columnspan=3, pady=5) # ===== Таблица ===== table_frame = Frame(self.root) table_frame.pack(fill="both", expand=True, padx=10, pady=10) columns = ("Название", "Жанр", "Год", "Рейтинг") self.tree = ttk.Treeview(table_frame, columns=columns, show="headings") for col in columns: self.tree.heading(col, text=col) self.tree.column(col, width=150) scrollbar = Scrollbar(table_frame, orient="vertical", command=self.tree.yview) self.tree.configure(yscrollcommand=scrollbar.set) self.tree.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y") def add_movie(self): title = self.title_entry.get().strip() genre = self.genre_entry.get().strip() year = self.year_entry.get().strip() rating = self.rating_entry.get().strip() # Валидация if not title or not genre: messagebox.showerror("Ошибка", "Название и жанр не могут быть пустыми") return try: year = int(year) if year < 1888 or year > 2026: raise ValueError except ValueError: messagebox.showerror("Ошибка", "Год должен быть целым числом (1888-2026)") return try: rating = float(rating) if not (0 <= rating <= 10): raise ValueError except ValueError: messagebox.showerror("Ошибка", "Рейтинг должен быть числом от 0 до 10") return movie = { "title": title, "genre": genre, "year": year, "rating": rating } self.movies.append(movie) self.save_data() self.clear_form() self.refresh_table() messagebox.showinfo("Успех", f"Фильм '{title}' добавлен!") def clear_form(self): self.title_entry.delete(0, END) self.genre_entry.delete(0, END) self.year_entry.delete(0, END) self.rating_entry.delete(0, END) def refresh_table(self, movie_list=None): for item in self.tree.get_children(): self.tree.delete(item) data = movie_list if movie_list is not None else self.movies for movie in data: self.tree.insert("", END, values=(movie["title"], movie["genre"], movie["year"], movie["rating"])) def filter_movies(self): genre_filter = self.genre_filter.get().strip().lower() year_filter = self.year_filter.get().strip() filtered = self.movies[:] if genre_filter: filtered = [m for m in filtered if genre_filter in m["genre"].lower()] if year_filter: try: year_filter = int(year_filter) filtered = [m for m in filtered if m["year"] == year_filter] except ValueError: messagebox.showerror("Ошибка", "Год в фильтре должен быть числом") self.refresh_table(filtered) def reset_filters(self): self.genre_filter.delete(0, END) self.year_filter.delete(0, END) self.refresh_table() def save_data(self): with open(self.data_file, "w", encoding="utf-8") as f: json.dump(self.movies, f, ensure_ascii=False, indent=4) def load_data(self): if os.path.exists(self.data_file): try: with open(self.data_file, "r", encoding="utf-8") as f: self.movies = json.load(f) except (json.JSONDecodeError, FileNotFoundError): self.movies = [] if __name__ == "__main__": root = Tk() app = MovieLibrary(root) root.mainloop()