from ctypes import alignment from tkinter import * from tkinter import ttk, filedialog, messagebox import configparser import db from PIL import ImageTk, Image root = None database = None config = None listbox = None image_label = None desc_label = None img = None fViewHelp = False def load_config(): global config config = configparser.ConfigParser() config.read('cfg.ini') def load_database(): global database, config database = db.DB(config['DEFAULT']['db_path']) def help_menu(): global root newWindow = Toplevel(root) newWindow.title("New Window") newWindow.geometry("200x200") Label(newWindow, text="This is a new window").pack() def fond_menu(): global root newWindow = Toplevel(root) newWindow.title("New Window") newWindow.geometry("200x200") Label(newWindow, text="This is a new window").pack() def close_prog(event=None): global database database.close() exit() def key_pressed(event): print(event.keysym) if event.keysym == 'F1': open_help_window() if event.keysym == 'F2': add_record_window() if event.keysym == 'F3': confirm_delete() if event.keysym == 'F4': update_record_window() def selected(event): global listbox, image_label, desc_label, img selected_indices = listbox.curselection() selected = ''.join([listbox.get(i) for i in selected_indices]) record = database.get_record_by_name(selected) img = ImageTk.PhotoImage(Image.open(record.img_path)) image_label.config(image=img) desc_label.insert(1.0, record.description) def add_record_window(event=""): global database, listbox def browse_image(): filename = filedialog.askopenfilename(parent=add_window) image_path_entry.delete(0, "end") image_path_entry.insert(0, filename) def add_button(): database.add_record(name=name_entry.get(), description=description_entry.get( 1.0, "end-1c"), img_path=image_path_entry.get()) load_listbox() add_window.destroy() # Создание окна add_window = Toplevel() add_window.title("Добавить запись") # Создание и размещение виджетов name_label = Label(add_window, text="Имя:") name_label.grid(row=0, column=0) name_entry = Entry(add_window, width=50) name_entry.grid(row=0, column=1) description_label = Label(add_window, text="Описание:") description_label.grid(row=1, column=0) description_entry = Text(add_window, width=50, height=10) description_entry.grid(row=1, column=1) image_path_label = Label(add_window, text="Путь до изображения:") image_path_label.grid(row=2, column=0) image_path_entry = Entry(add_window, width=50) image_path_entry.grid(row=2, column=1) browse_button = Button(add_window, text="Обзор", command=browse_image) browse_button.grid(row=2, column=2) update_button = Button(add_window, text="Добавить", command=add_button) update_button.grid(row=3, column=0, columnspan=2) add_window.mainloop() def update_record_window(event=""): global database, listbox def browse_image(): filename = filedialog.askopenfilename(parent=update_window) image_path_entry.delete(0, "end") image_path_entry.insert(0, filename) def edit_button(): database.edit_record(selected, name=name_entry.get(), description=description_entry.get( 1.0, "end-1c"), img_path=image_path_entry.get()) load_listbox() update_window.destroy() selected_indices = listbox.curselection() selected = ''.join([listbox.get(i) for i in selected_indices]) record = database.get_record_by_name(selected) if record == None: return # Создание окна update_window = Toplevel() update_window.title("Изменить запись") update_window.lift() # Создание и размещение виджетов name_label = Label(update_window, text="Имя:") name_label.grid(row=0, column=0) name_entry = Entry(update_window, width=50) name_entry.insert(0, record.name) name_entry.grid(row=0, column=1) description_label = Label(update_window, text="Описание:") description_label.grid(row=1, column=0) description_entry = Text(update_window, width=50, height=10) description_entry.insert("1.0", record.description) description_entry.grid(row=1, column=1) image_path_label = Label(update_window, text="Путь до изображения:") image_path_label.grid(row=2, column=0) image_path_entry = Entry(update_window, width=50) image_path_entry.insert(0, record.img_path) image_path_entry.grid(row=2, column=1) browse_button = Button(update_window, text="Обзор", command=browse_image) browse_button.grid(row=2, column=2) update_button = Button(update_window, text="Изменить", command=edit_button) update_button.grid(row=3, column=0, columnspan=2) update_window.mainloop() def load_listbox(): global listbox, database listbox.delete(0, "end") for i, record in enumerate(database.load_records(), 0): listbox.insert(i, record.name) def open_help_window(): global fViewHelp print(fViewHelp) def close_help(): global fViewHelp fViewHelp = False top.destroy() if not fViewHelp: top = Toplevel() top.title("Справка") top.geometry("400x200") top.maxsize(400, 200) top.minsize(400, 200) top.focus_set() top.protocol("WM_DELETE_WINDOW", close_help) label = Label(top, text="База данных 'Известные моря России'\nПозволяет добавлять / изменять / удалять \n информацию.\nКлавиши программы:\nF1-вызов справки о программе,\nF2-добавить в базу данных,\nF3-удалить из базы данных,\nF4-изменить запись в базе данных,\nF10-меню программы", justify='left', anchor='w') label.place(x=0, y=0, relwidth=0.95) close_button = Button(top, text="Закрыть", command=close_help) close_button.place(x=300, y=150) fViewHelp = True def open_about_window(): aboutwindow = Toplevel() aboutwindow.title("О программе") aboutwindow.geometry("300x100") aboutwindow.maxsize(300, 100) aboutwindow.minsize(300, 100) aboutwindow.grab_set() label = Label(aboutwindow, text="База данных 'Известные моря России'\n(c) Romanko M.I., Russia, 2023", anchor=CENTER, justify='center') label.place(relx=0.5, rely=0.5, anchor='center') def confirm_delete(): global database, listbox selected_indices = listbox.curselection() selected = ''.join([listbox.get(i) for i in selected_indices]) result = messagebox.askquestion( "Подтверждение", "Вы уверены, что хотите удалить запись?") if result == 'yes': database.delete_record(selected) messagebox.showinfo("Успех", "Запись успешно удалена") load_listbox() else: messagebox.showinfo("Отмена", "Удаление отменено") def main(): global root, listbox, database, image_label, desc_label load_config() load_database() root = Tk() root.title("amDB") root.geometry('700x500+50+50') root.minsize(700, 500) root.maxsize(700, 500) root.bind('', key_pressed) root.bind('', key_pressed) root.bind('', key_pressed) root.bind('', key_pressed) root.bind('', key_pressed) root.bind('', close_prog) main_menu = Menu() fond_menu = Menu(tearoff=0) fond_menu.add_command(label="Найти...") fond_menu.add_separator() fond_menu.add_command(label="Добавить F2", command=add_record_window) fond_menu.add_command(label="Удалить F3", command=confirm_delete) fond_menu.add_command(label="Изменить F4", command=update_record_window) fond_menu.add_separator() fond_menu.add_command(label="Выход Ctrl+X", command=close_prog) help_menu = Menu(tearoff=0) help_menu.add_command(label="Содержание", command=open_help_window) help_menu.add_separator() help_menu.add_command(label="О программе", command=open_about_window) main_menu.add_cascade(label="Фонд", menu=fond_menu) main_menu.add_cascade(label="Справка", menu=help_menu) label_bottom = Label(root, text="F1-справка F2-добавить F3-удалить F4-изменить F10-меню", bd=1, relief=SUNKEN, anchor=W, height=1) label_bottom.place(relx=0.0, rely=0.95, relwidth=1) listbox = Listbox(root, justify="left", width=30) listbox.bind("<>", selected) listbox.place(x=0, y=0, relheight=0.95) load_listbox() image_frame = ttk.Frame(root) image_label = Label(image_frame) image_label.place(relx=0.0, rely=0.0, relheight=1.0, relwidth=1.0) image_frame.place(x=200, rely=0.0, relheight=0.95, width=300) desc_frame = ttk.Frame(root) desc_label = Text(desc_frame, wrap="word") desc_label.place(relx=0.0, rely=0.0, relheight=1.0, relwidth=1.0) desc_frame.place(x=500, rely=0.0, relwidth=0.3, relheight=0.95) root.config(menu=main_menu) root.mainloop() if __name__ == "__main__": main()