DerioFT

appPage.py

May 26th, 2021
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.94 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import messagebox as msg
  3. from PIL import Image, ImageTk
  4.  
  5. class AppPage(tk.Frame):
  6.  
  7.     def __init__(self, parent, App):
  8.         self.app = App
  9.         self.settings = App.settings
  10.         self.current_contact = self.settings.contacts[0]
  11.         self.last_current_contact_index = 0
  12.         self.update_mode = False
  13.  
  14.         super().__init__(parent) #parent = window.container
  15.         self.grid(row=0, column=0, sticky="nsew")
  16.  
  17.         parent.grid_rowconfigure(0, weight=1)
  18.         parent.grid_columnconfigure(0, weight=1)
  19.  
  20.         self.create_left_frame()
  21.         self.create_right_frame()
  22.         self.config_left_and_right_frame()     
  23.  
  24.     def create_left_frame(self):
  25.         self.left_frame = tk.Frame(self, bg="pink")
  26.         self.left_frame.grid(row=0, column=0, sticky="nsew")
  27.  
  28.         self.create_left_header()
  29.         self.create_left_content()
  30.  
  31.     def create_right_frame(self):
  32.         self.right_frame = tk.Frame(self, bg="white", width=2*self.settings.width//3)
  33.         self.right_frame.grid(row=0, column=1, sticky="nsew")
  34.  
  35.         self.create_right_header()
  36.         self.create_right_content()
  37.         self.create_right_footer()
  38.  
  39.     def config_left_and_right_frame(self):
  40.         self.grid_columnconfigure(0, weight=1) # 1/3
  41.         self.grid_columnconfigure(1, weight=2) # 2/3
  42.         self.grid_rowconfigure(0, weight=1)
  43.  
  44.     def create_left_header(self):
  45.         frame_w = self.settings.width//3
  46.         frame_h = self.settings.height//5
  47.         self.left_header = tk.Frame(self.left_frame, width=frame_w, height=frame_h)
  48.         self.left_header.pack()
  49.  
  50.         image = Image.open(self.settings.logo)
  51.         i_w, i_h = image.size
  52.         ratio = i_w/frame_w
  53.         new_size = (int(i_w/ratio), int(i_h/ratio)) # (x,y)
  54.         image = image.resize(new_size)
  55.         self.logo = ImageTk.PhotoImage(image)
  56.  
  57.         self.label_logo = tk.Label(self.left_header, image=self.logo)
  58.         self.label_logo.pack()
  59.  
  60.         self.search_box_frame = tk.Frame(self.left_frame, bg="white", width=frame_w, height=frame_h//4)
  61.         self.search_box_frame.pack(fill="x")
  62.  
  63.         self.entry_search = tk.Entry(self.search_box_frame, bg="white", fg="black", font=("Arial", 12))
  64.         self.entry_search.grid(row=0, column=0)
  65.  
  66.         self.button_search = tk.Button(self.search_box_frame, bg="white", fg="black", text="Find", font=("Arial", 12))
  67.         self.button_search.grid(row=0, column=1)
  68.  
  69.         self.search_box_frame.grid_columnconfigure(0, weight=3)
  70.         self.search_box_frame.grid_columnconfigure(1, weight=1)
  71.  
  72.     def create_left_content(self):
  73.         frame_w = self.settings.width//3
  74.         frame_h = 4*self.settings.height//5
  75.         self.left_content = tk.Frame(self.left_frame, width=frame_w, height=frame_h, bg="white")
  76.         self.left_content.pack(fill="x")
  77.  
  78.         self.contacts_list_box = tk.Listbox(self.left_content, bg="white", fg="black", font=("Arial", 12), height=frame_h)
  79.         self.contacts_list_box.pack(side="left", fill="both", expand=True)
  80.  
  81.         self.contacts_scroll = tk.Scrollbar(self.left_content)
  82.         self.contacts_scroll.pack(side="right", fill="y")
  83.  
  84.         contacts = self.settings.contacts
  85.         for contact in contacts:
  86.             for phone, info in contact.items():
  87.                 full_name = f"{info['f_name']} {info['l_name']}"
  88.                 self.contacts_list_box.insert("end", full_name)
  89.  
  90.         self.contacts_list_box.configure(yscrollcommand=self.contacts_scroll.set) # set di Scroll
  91.         self.contacts_scroll.configure(command=self.contacts_list_box.yview) # yview di Listbox
  92.  
  93.         self.contacts_list_box.bind("<<ListboxSelect>>", self.clicked_item_inListBox)
  94.  
  95.  
  96.     def clicked_item_inListBox(self, event):
  97.         if not self.update_mode:
  98.             selection = event.widget.curselection()
  99.             try:
  100.                 index = selection[0]
  101.                 self.last_current_contact_index = index
  102.             except IndexError:
  103.                 index = self.last_current_contact_index
  104.                 # print(index)
  105.                 self.current_contact = self.settings.contacts[index]
  106.  
  107.             for numberPhone, info in self.current_contact.items():
  108.                 phone = numberPhone
  109.                 full_name = info['f_name']+" "+info['l_name']
  110.                 address = info['address']
  111.                 email = info['email']
  112.  
  113.             self.full_name_label.configure(text=full_name)
  114.             self.table_info[0][1].configure(text=phone)
  115.             self.table_info[1][1].configure(text=address)
  116.             self.table_info[2][1].configure(text=email)
  117.  
  118.  
  119.     def create_right_header(self):
  120.         frame_w = 2*self.settings.width//3
  121.         frame_h = self.settings.height//5
  122.  
  123.         self.right_header = tk.Frame(self.right_frame, width=frame_w, height=frame_h, bg="bisque")
  124.         self.right_header.pack()
  125.         self.create_detail_right_header()
  126.  
  127.     def create_detail_right_header(self):
  128.         frame_w = 2*self.settings.width//3
  129.         frame_h = self.settings.height//5
  130.  
  131.         self.detail_header = tk.Frame(self.right_header, width=frame_w, height=frame_h, bg="green")
  132.         self.detail_header.grid(row=0, column=0, sticky="nsew")
  133.  
  134.         data_dictionary = list(self.current_contact.values())[0]
  135.         full_name = f"{data_dictionary['f_name']} {data_dictionary['l_name']}"
  136.         self.virt_img = tk.PhotoImage(width=1, height=1)
  137.         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")
  138.         self.full_name_label.pack()
  139.  
  140.         self.right_header.grid_rowconfigure(0, weight=1)
  141.         self.right_header.grid_columnconfigure(0, weight=1)
  142.  
  143.  
  144.     def create_right_content(self):
  145.         frame_w = 2*self.settings.width//3
  146.         frame_h = 3*(4*self.settings.height//5)//4
  147.  
  148.         self.right_content = tk.Frame(self.right_frame, width=frame_w, height=frame_h, bg="white")
  149.         self.right_content.pack(expand=True, pady=90)
  150.         self.create_detail_right_content()
  151.  
  152.     def create_detail_right_content(self):
  153.         frame_w = 2*self.settings.width//3
  154.         frame_h = 3*(4*self.settings.height//5)//4
  155.  
  156.         self.detail_content = tk.Frame(self.right_content, width=frame_w, height=frame_h, bg="white")
  157.         self.detail_content.grid(row=0, column=0, sticky="nsew")
  158.  
  159.         for numberPhone, info in self.current_contact.items():
  160.             info = [
  161.                 ['Telepon :', numberPhone],
  162.                 ['Alamat :', info['address']],
  163.                 ['Email :', info['email']]
  164.             ]
  165.         self.table_info = []
  166.         rows, columns = len(info), len(info[0]) # 3, 2
  167.         for row in range(rows):
  168.             aRow = []
  169.             for column in range(columns):
  170.                 label = tk.Label(self.detail_content, text=info[row][column], font=("Arial", 12), bg="white")
  171.                 aRow.append(label)
  172.                 if column == 0:
  173.                     sticky = "e"
  174.                 else:
  175.                     sticky = "w"
  176.                 label.grid(row=row, column=column, sticky=sticky)
  177.             self.table_info.append(aRow)
  178.  
  179.  
  180.         self.right_content.grid_rowconfigure(0, weight=1)
  181.         self.right_content.grid_columnconfigure(0, weight=1)
  182.  
  183.  
  184.     def create_right_footer(self):
  185.         frame_w = 2*self.settings.width//3
  186.         frame_h = (4*self.settings.height//5)//4
  187.  
  188.         self.right_footer = tk.Frame(self.right_frame, width=frame_w, height=frame_h, bg="white")
  189.         self.right_footer.pack(expand=True)
  190.  
  191.         self.create_detail_right_footer()
  192.  
  193.  
  194.     def create_detail_right_footer(self):
  195.         frame_w = 2*self.settings.width//3
  196.         frame_h = (4*self.settings.height//5)//4
  197.  
  198.         self.detail_footer = tk.Frame(self.right_footer, width=frame_w, height=frame_h, bg="white")
  199.         self.detail_footer.grid(row=0, column=0, sticky="nsew")
  200.  
  201.         features = ['Update', 'Delete', 'Add New']
  202.         commands = [self.clicked_update_btn, self.clicked_delete_btn, self.clicked_add_new_btn]
  203.         self.buttons_features = []
  204.         for feature in features:
  205.             button = tk.Button(self.detail_footer, text=feature, bg="white", fg="black", bd=0, font=("Arial", 12, "bold"), command=commands[features.index(feature)])
  206.             button.grid(row=0, column=features.index(feature), sticky="nsew", padx=20)
  207.             self.buttons_features.append(button)
  208.  
  209.         self.right_footer.grid_rowconfigure(0, weight=1)
  210.         self.right_footer.grid_columnconfigure(0, weight=1)
  211.  
  212.  
  213.     def clicked_update_btn(self):
  214.         self.update_mode = True
  215.         frame_w = 2*self.settings.width//3
  216.         frame_h = self.settings.height//5
  217.  
  218.         self.detail_content.destroy()
  219.         self.detail_footer.destroy()
  220.  
  221.         self.detail_update_content = tk.Frame(self.right_content, width=frame_w, height=frame_h, bg="white")
  222.         self.detail_update_content.grid(row=0, column=0, sticky="nsew")
  223.  
  224.         for numberPhone, info in self.current_contact.items():
  225.             info = [
  226.                 ['Nama Depan :', info['f_name']],
  227.                 ['Nama Belakang :', info['l_name']],
  228.                 ['Telepon :', numberPhone],
  229.                 ['Alamat :', info['address']],
  230.                 ['Email :', info['email']]
  231.             ]
  232.         self.table_info = []
  233.         self.entry_update_contact_vars = [tk.StringVar(), tk.StringVar(), tk.StringVar(), tk.StringVar(), tk.StringVar()]
  234.         rows, columns = len(info), len(info[0]) # 3, 2
  235.         for row in range(rows):
  236.             aRow = []
  237.             for column in range(columns):
  238.                 if column == 0:
  239.                     label = tk.Label(self.detail_update_content, text=info[row][column], font=("Arial", 12), bg="white")
  240.                     sticky = "e"
  241.                     aRow.append(label)
  242.                     label.grid(row=row, column=column, sticky=sticky)
  243.                 else:
  244.                     entry = tk.Entry(self.detail_update_content, font=("Arial", 12), bg="white", textvariable=self.entry_update_contact_vars[row])
  245.                     entry.insert(0, info[row][column])
  246.                     sticky = "w"
  247.                     aRow.append(entry)
  248.                     entry.grid(row=row, column=column, sticky=sticky)
  249.             self.table_info.append(aRow)
  250.  
  251.         self.right_content.grid_rowconfigure(0, weight=1)
  252.         self.right_content.grid_columnconfigure(0, weight=1)
  253.  
  254.         frame_w = 2*self.settings.width//3
  255.         frame_h = (4*self.settings.height//5)//4
  256.  
  257.         self.detail_update_footer = tk.Frame(self.right_footer, width=frame_w, height=frame_h, bg="white")
  258.         self.detail_update_footer.grid(row=0, column=0, sticky="nsew")
  259.  
  260.         features = ['Save', 'Cancel']
  261.         commands = [self.clicked_save_contact_btn, self.clicked_cancel_contact_btn]
  262.         self.buttons_features = []
  263.         for feature in features:
  264.             button = tk.Button(self.detail_update_footer, text=feature, bg="white", fg="black", bd=0, font=("Arial", 12, "bold"), command=commands[features.index(feature)])
  265.             button.grid(row=0, column=features.index(feature), sticky="nsew", padx=20)
  266.             self.buttons_features.append(button)
  267.  
  268.         self.right_footer.grid_rowconfigure(0, weight=1)
  269.         self.right_footer.grid_columnconfigure(0, weight=1)
  270.  
  271.  
  272.     def clicked_delete_btn(self):
  273.         print('works')
  274.  
  275.     def clicked_add_new_btn(self):
  276.         print('works')
  277.  
  278.     def clicked_save_contact_btn(self):
  279.         self.update_mode = False
  280.  
  281.         confirm = msg.askyesnocancel('Contactapp Save Confirmation', 'Are you sure to update this contact ?')
  282.  
  283.         index = self.last_current_contact_index
  284.         if confirm:
  285.             f_name = self.entry_update_contact_vars[0].get()
  286.             l_name = self.entry_update_contact_vars[1].get()
  287.             phone = self.entry_update_contact_vars[2].get()
  288.             address = self.entry_update_contact_vars[3].get()
  289.             email = self.entry_update_contact_vars[4].get()
  290.             self.settings.contacts[index] = {
  291.                 phone : {
  292.                     "f_name" : f_name,
  293.                     "l_name" : l_name,
  294.                     "address" : address,
  295.                     "email" : email
  296.                 }
  297.             }
  298.         self.current_contact = self.settings.contacts[index]
  299.  
  300.         self.detail_header.destroy()
  301.         self.detail_update_footer.destroy()
  302.         self.detail_update_footer.destroy()
  303.  
  304.         #RECREATE HEADER
  305.         self.create_detail_right_header()
  306.  
  307.         #RECREATE CONTENT
  308.         self.create_detail_right_content()
  309.  
  310.         #RECREATE FOOTER
  311.         self.create_detail_right_footer()
  312.        
  313.  
  314.     def clicked_cancel_contact_btn(self):
  315.         print('cancel btn works')
Add Comment
Please, Sign In to add comment