"""This is the main function""" from copy import deepcopy import PySimpleGUI as sg from tinydb import TinyDB, Query from logo_source import COMPUTER_KEEPER_LOGO TABLE=None WINDOW=None # Define the window's contents colum_lut = ["Serial Number","Brand","Grade","Name"] layout = [[sg.Menu([['File', ['Open', 'Save', 'Add Computer','Remove Computer']]])], [sg.Text("search"), sg.Input(s=(35,), enable_events=True,key="search")], [sg.Input(s=(19,),enable_events=True,key="filter Serial Number"), sg.Input(s=(6,),enable_events=True,key="filter Brand"), sg.Input(s=(6,),enable_events=True,key="filter Grade"), sg.Input(s=(4,),enable_events=True,key="filter Name")], [sg.Table([["word","Yes"]],colum_lut,key = "table", enable_events=True, expand_x = True, expand_y =True)], [sg.Text("Serial Number")], [sg.Input(key='Serial Number')], [sg.Text("Brand")], [sg.Input(key='Brand')], [sg.Text("Grade")], [sg.Input(key='Grade')], [sg.Text("Name")], [sg.Input(key='Name')], [sg.Text(size=(40,1), key='OUTPUT')], [sg.Button('Check In'), sg.Button('Check Out')]] add_computer_layout = [[sg.Text("Serial Number")], [sg.Input(key='Serial Number')], [sg.Text("Brand")], [sg.Input(key='Brand')], [sg.Text("Grade")], [sg.Input(key='Grade')], [sg.Text("Name")], [sg.Input(key='Name')], [sg.Button('Add Computer'),]] def double_click(event): """ Additional event for double-click on header event: class event """ region = TABLE.identify("region", event.x, event.y) if region == 'heading': # Only care double-clock on headings cid = int(TABLE.identify_column(event.x)[1:])-1 # check which column clicked WINDOW.write_event_value("-TABLE-DOUBLE-CLICK-", cid) def add_computer(): window = sg.Window('Add Computer', deepcopy(add_computer_layout)) while True: event, values = window.read() if event == sg.WINDOW_CLOSED or event == 'Add Computer': break # Finish up by removing from the screen window.close() return values def format_table(table_list): Computer = [] for item in table_list: The_Device = [] for colum in colum_lut: The_Device.append(item[colum]) Computer.append(The_Device) return Computer def main(): """Core of ComputerKeeper - The Main Application.""" global TABLE,WINDOW db= TinyDB("./db.json") computer = format_table(db.all()) # Create the window window = sg.Window('Computer Keeper', layout, finalize=True, icon=COMPUTER_KEEPER_LOGO, resizable = True) WINDOW=window window["table"].update(computer) table = window['table'].Widget table.bind('', double_click, add='+') TABLE=table # Display and interact with the Window using an Event Loop while True: event, values = window.read() # See if user wants to quit or window was closed if event == sg.WINDOW_CLOSED or event == 'Quit': break if event == 'Add Computer': new_computer = add_computer() existing_table = window["table"].get() existing_table.append( list(new_computer.values())) window["table"].update(existing_table) db.insert(new_computer) elif event == 'Remove Computer': if values["table"]: existing_table = window["table"].get() serial = existing_table.pop(values["table"][0])[0] query = Query() db.remove(query["Serial Number"] == serial) window["table"].update(existing_table) elif event == '-TABLE-DOUBLE-CLICK-': column = values[event] print(f'Click on column {column}') # Sort data on the table by the value of column # then update window['-TABLE-'].update(values=new_data) elif event.find("filter") != -1: filter_database = lambda s: s.lower().find(values[event].lower()) != -1 Computers=Query() result=db.search(Computers[event[7:]].test(filter_database)) window["table"].update(format_table(result)) elif event == "search": filter_database = lambda s: s.lower().find(values[event].lower()) != -1 Computers=Query() result=db.search( Computers["Serial Number"].test(filter_database)| Computers["Brand"].test(filter_database)| Computers["Grade"].test(filter_database)| Computers["Name"].test(filter_database) ) window["table"].update(format_table(result)) elif event == "table" and values["table"]: row=window["table"].get()[values["table"][0]] window["Serial Number"].update(row[0]) window["Brand"].update(row[1]) window["Grade"].update(row[2]) window["Name"].update(row[3]) elif event == "Check Out": SN = window["Serial Number"].get() G = window["Grade"].get() N = window["Name"].get() Table = window["table"].get() print(Table) for row in Table: if SN == row[0]: row[2] = G row[3] = N window["table"].update(Table) query=Query() db.update({"Grade": G, "Name": N}, query["Serial Number"] == SN) # Finish up by removing from the screen window.close() if __name__ == "__main__": main()