Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- from tkinter import messagebox as msg
- from PIL import Image, ImageTk
- class AppPage(tk.Frame):
- def __init__(self, parent, App):
- self.app = App
- self.settings = App.settings
- self.current_contact = self.settings.contacts[0]
- self.last_current_contact_index = 0
- self.update_mode = False
- super().__init__(parent) #parent = window.container
- self.grid(row=0, column=0, sticky="nsew")
- parent.grid_rowconfigure(0, weight=1)
- parent.grid_columnconfigure(0, weight=1)
- self.create_left_frame()
- self.create_right_frame()
- self.config_left_and_right_frame()
- def create_left_frame(self):
- self.left_frame = tk.Frame(self, bg="pink")
- self.left_frame.grid(row=0, column=0, sticky="nsew")
- self.create_left_header()
- self.create_left_content()
- def create_right_frame(self):
- self.right_frame = tk.Frame(self, bg="white", width=2*self.settings.width//3)
- self.right_frame.grid(row=0, column=1, sticky="nsew")
- self.create_right_header()
- self.create_right_content()
- self.create_right_footer()
- def config_left_and_right_frame(self):
- self.grid_columnconfigure(0, weight=1) # 1/3
- self.grid_columnconfigure(1, weight=2) # 2/3
- self.grid_rowconfigure(0, weight=1)
- def create_left_header(self):
- frame_w = self.settings.width//3
- frame_h = self.settings.height//5
- self.left_header = tk.Frame(self.left_frame, width=frame_w, height=frame_h)
- self.left_header.pack()
- image = Image.open(self.settings.logo)
- i_w, i_h = image.size
- ratio = i_w/frame_w
- new_size = (int(i_w/ratio), int(i_h/ratio)) # (x,y)
- image = image.resize(new_size)
- self.logo = ImageTk.PhotoImage(image)
- self.label_logo = tk.Label(self.left_header, image=self.logo)
- self.label_logo.pack()
- self.search_box_frame = tk.Frame(self.left_frame, bg="white", width=frame_w, height=frame_h//4)
- self.search_box_frame.pack(fill="x")
- self.entry_search = tk.Entry(self.search_box_frame, bg="white", fg="black", font=("Arial", 12))
- self.entry_search.grid(row=0, column=0)
- self.button_search = tk.Button(self.search_box_frame, bg="white", fg="black", text="Find", font=("Arial", 12))
- self.button_search.grid(row=0, column=1)
- self.search_box_frame.grid_columnconfigure(0, weight=3)
- self.search_box_frame.grid_columnconfigure(1, weight=1)
- def create_left_content(self):
- frame_w = self.settings.width//3
- frame_h = 4*self.settings.height//5
- self.left_content = tk.Frame(self.left_frame, width=frame_w, height=frame_h, bg="white")
- self.left_content.pack(fill="x")
- self.contacts_list_box = tk.Listbox(self.left_content, bg="white", fg="black", font=("Arial", 12), height=frame_h)
- self.contacts_list_box.pack(side="left", fill="both", expand=True)
- self.contacts_scroll = tk.Scrollbar(self.left_content)
- self.contacts_scroll.pack(side="right", fill="y")
- contacts = self.settings.contacts
- for contact in contacts:
- for phone, info in contact.items():
- full_name = f"{info['f_name']} {info['l_name']}"
- self.contacts_list_box.insert("end", full_name)
- self.contacts_list_box.configure(yscrollcommand=self.contacts_scroll.set) # set di Scroll
- self.contacts_scroll.configure(command=self.contacts_list_box.yview) # yview di Listbox
- self.contacts_list_box.bind("<<ListboxSelect>>", self.clicked_item_inListBox)
- def clicked_item_inListBox(self, event):
- if not self.update_mode:
- selection = event.widget.curselection()
- try:
- index = selection[0]
- self.last_current_contact_index = index
- except IndexError:
- index = self.last_current_contact_index
- # print(index)
- self.current_contact = self.settings.contacts[index]
- for numberPhone, info in self.current_contact.items():
- phone = numberPhone
- full_name = info['f_name']+" "+info['l_name']
- address = info['address']
- email = info['email']
- self.full_name_label.configure(text=full_name)
- self.table_info[0][1].configure(text=phone)
- self.table_info[1][1].configure(text=address)
- self.table_info[2][1].configure(text=email)
- def create_right_header(self):
- frame_w = 2*self.settings.width//3
- frame_h = self.settings.height//5
- self.right_header = tk.Frame(self.right_frame, width=frame_w, height=frame_h, bg="bisque")
- self.right_header.pack()
- self.create_detail_right_header()
- def create_detail_right_header(self):
- frame_w = 2*self.settings.width//3
- frame_h = self.settings.height//5
- self.detail_header = tk.Frame(self.right_header, width=frame_w, height=frame_h, bg="green")
- self.detail_header.grid(row=0, column=0, sticky="nsew")
- data_dictionary = list(self.current_contact.values())[0]
- full_name = f"{data_dictionary['f_name']} {data_dictionary['l_name']}"
- self.virt_img = tk.PhotoImage(width=1, height=1)
- self.full_name_label = tk.Label(self.detail_header, text=full_name, font=("Arial", 30), width=frame_w, height=frame_h, image=self.virt_img, compound='c', bg="white")
- self.full_name_label.pack()
- self.right_header.grid_rowconfigure(0, weight=1)
- self.right_header.grid_columnconfigure(0, weight=1)
- def create_right_content(self):
- frame_w = 2*self.settings.width//3
- frame_h = 3*(4*self.settings.height//5)//4
- self.right_content = tk.Frame(self.right_frame, width=frame_w, height=frame_h, bg="white")
- self.right_content.pack(expand=True, pady=90)
- self.create_detail_right_content()
- def create_detail_right_content(self):
- frame_w = 2*self.settings.width//3
- frame_h = 3*(4*self.settings.height//5)//4
- self.detail_content = tk.Frame(self.right_content, width=frame_w, height=frame_h, bg="white")
- self.detail_content.grid(row=0, column=0, sticky="nsew")
- for numberPhone, info in self.current_contact.items():
- info = [
- ['Telepon :', numberPhone],
- ['Alamat :', info['address']],
- ['Email :', info['email']]
- ]
- self.table_info = []
- rows, columns = len(info), len(info[0]) # 3, 2
- for row in range(rows):
- aRow = []
- for column in range(columns):
- label = tk.Label(self.detail_content, text=info[row][column], font=("Arial", 12), bg="white")
- aRow.append(label)
- if column == 0:
- sticky = "e"
- else:
- sticky = "w"
- label.grid(row=row, column=column, sticky=sticky)
- self.table_info.append(aRow)
- self.right_content.grid_rowconfigure(0, weight=1)
- self.right_content.grid_columnconfigure(0, weight=1)
- def create_right_footer(self):
- frame_w = 2*self.settings.width//3
- frame_h = (4*self.settings.height//5)//4
- self.right_footer = tk.Frame(self.right_frame, width=frame_w, height=frame_h, bg="white")
- self.right_footer.pack(expand=True)
- self.create_detail_right_footer()
- def create_detail_right_footer(self):
- frame_w = 2*self.settings.width//3
- frame_h = (4*self.settings.height//5)//4
- self.detail_footer = tk.Frame(self.right_footer, width=frame_w, height=frame_h, bg="white")
- self.detail_footer.grid(row=0, column=0, sticky="nsew")
- features = ['Update', 'Delete', 'Add New']
- commands = [self.clicked_update_btn, self.clicked_delete_btn, self.clicked_add_new_btn]
- self.buttons_features = []
- for feature in features:
- button = tk.Button(self.detail_footer, text=feature, bg="white", fg="black", bd=0, font=("Arial", 12, "bold"), command=commands[features.index(feature)])
- button.grid(row=0, column=features.index(feature), sticky="nsew", padx=20)
- self.buttons_features.append(button)
- self.right_footer.grid_rowconfigure(0, weight=1)
- self.right_footer.grid_columnconfigure(0, weight=1)
- def clicked_update_btn(self):
- self.update_mode = True
- frame_w = 2*self.settings.width//3
- frame_h = self.settings.height//5
- self.detail_content.destroy()
- self.detail_footer.destroy()
- self.detail_update_content = tk.Frame(self.right_content, width=frame_w, height=frame_h, bg="white")
- self.detail_update_content.grid(row=0, column=0, sticky="nsew")
- for numberPhone, info in self.current_contact.items():
- info = [
- ['Nama Depan :', info['f_name']],
- ['Nama Belakang :', info['l_name']],
- ['Telepon :', numberPhone],
- ['Alamat :', info['address']],
- ['Email :', info['email']]
- ]
- self.table_info = []
- self.entry_update_contact_vars = [tk.StringVar(), tk.StringVar(), tk.StringVar(), tk.StringVar(), tk.StringVar()]
- rows, columns = len(info), len(info[0]) # 3, 2
- for row in range(rows):
- aRow = []
- for column in range(columns):
- if column == 0:
- label = tk.Label(self.detail_update_content, text=info[row][column], font=("Arial", 12), bg="white")
- sticky = "e"
- aRow.append(label)
- label.grid(row=row, column=column, sticky=sticky)
- else:
- entry = tk.Entry(self.detail_update_content, font=("Arial", 12), bg="white", textvariable=self.entry_update_contact_vars[row])
- entry.insert(0, info[row][column])
- sticky = "w"
- aRow.append(entry)
- entry.grid(row=row, column=column, sticky=sticky)
- self.table_info.append(aRow)
- self.right_content.grid_rowconfigure(0, weight=1)
- self.right_content.grid_columnconfigure(0, weight=1)
- frame_w = 2*self.settings.width//3
- frame_h = (4*self.settings.height//5)//4
- self.detail_update_footer = tk.Frame(self.right_footer, width=frame_w, height=frame_h, bg="white")
- self.detail_update_footer.grid(row=0, column=0, sticky="nsew")
- features = ['Save', 'Cancel']
- commands = [self.clicked_save_contact_btn, self.clicked_cancel_contact_btn]
- self.buttons_features = []
- for feature in features:
- button = tk.Button(self.detail_update_footer, text=feature, bg="white", fg="black", bd=0, font=("Arial", 12, "bold"), command=commands[features.index(feature)])
- button.grid(row=0, column=features.index(feature), sticky="nsew", padx=20)
- self.buttons_features.append(button)
- self.right_footer.grid_rowconfigure(0, weight=1)
- self.right_footer.grid_columnconfigure(0, weight=1)
- def clicked_delete_btn(self):
- print('works')
- def clicked_add_new_btn(self):
- print('works')
- def clicked_save_contact_btn(self):
- self.update_mode = False
- confirm = msg.askyesnocancel('Contactapp Save Confirmation', 'Are you sure to update this contact ?')
- index = self.last_current_contact_index
- if confirm:
- f_name = self.entry_update_contact_vars[0].get()
- l_name = self.entry_update_contact_vars[1].get()
- phone = self.entry_update_contact_vars[2].get()
- address = self.entry_update_contact_vars[3].get()
- email = self.entry_update_contact_vars[4].get()
- self.settings.contacts[index] = {
- phone : {
- "f_name" : f_name,
- "l_name" : l_name,
- "address" : address,
- "email" : email
- }
- }
- self.current_contact = self.settings.contacts[index]
- self.detail_header.destroy()
- self.detail_update_footer.destroy()
- self.detail_update_footer.destroy()
- #RECREATE HEADER
- self.create_detail_right_header()
- #RECREATE CONTENT
- self.create_detail_right_content()
- #RECREATE FOOTER
- self.create_detail_right_footer()
- def clicked_cancel_contact_btn(self):
- print('cancel btn works')
Add Comment
Please, Sign In to add comment