Shop Revisted - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: General (https://python-forum.io/forum-1.html) +--- Forum: Code sharing (https://python-forum.io/forum-5.html) +--- Thread: Shop Revisted (/thread-38565.html) |
Shop Revisted - menator01 - Oct-30-2022 Buy/add/delete items. May still have a bug or two. from tabulate import tabulate from os import system, name from time import sleep def clear(): system('cls' if name == 'nt' else 'clear') class Product: ''' This class simply holds a dict with item number, item and cost. Dict format is number for key and a tuple for holding item and cost ''' def __init__(self): self.items = { '1': ('hotdog', 1.25), '2': ('hamburger', 2.25), '3': ('chili cheese fries', 3.25) } def add(self, item, cost): ''' Method for adding item and cost to items dict. Will also edit price if same item is entered ''' for k, v in self.items.items(): if item in v: self.items[k] = (item, cost) return self.items[f'{len(self.items)+1}'] = (item, cost) def delete(self, item): ''' Method for deleting item from items dict ''' key = False for k, v in self.items.items(): if item in v: key = k if key: self.items.pop(key) self.items = {str(i+1):value for i, value in enumerate(self.items.values())} return True return False class Store: ''' Store class is for displaying number, item, and cost. ''' def display(self, arg): items = [] for k, v in arg.items(): items.append([k+'.', v[0].title(), f'${v[1]:.2f}']) print(tabulate(items, headers=['#','Item','Cost'],tablefmt='fancy_grid')) def msg(self, text): print('\n'+'*'*round((len(text)/2)-3) + ' Shop ' + '*'*round((len(text)/2)-3)) print(f'\n{text}\n') class Controller: def __init__(self, product, store): ''' Controller class is for communication between all classes ''' self.product = product self.store = store def menu(self): ''' Method for getting menu option ''' option = input('\nPlease enter an option.\n>> ') if option: return option return False def add(self, item, cost): ''' Method for adding an item ''' controller.product.add(item, cost) def delete(self, item): ''' Method for deleting an item ''' action = controller.product.delete(item) if action: return True return False def get_total(self, amount, price): ''' Method for getting price total ''' return amount*price if __name__ == '__main__': controller = Controller(Product(), Store()) clear() while True: print('*'*11 + ' Shop ' + '*'*11) controller.store.display(controller.product.items) text = 'Options: number = order, admin = add/delete items, q = exit' controller.store.msg(text) orders = controller.product.items.keys() option = controller.menu() if option == 'q': clear() controller.store.msg('Goodbye!') break if option in orders: clear() item = controller.product.items[option][0].title() text = f'How many boxes of {item}\'s do you want?' controller.store.msg(text) try: amount = int(input('>> ')) price = controller.product.items[option][1] total = controller.get_total(amount, price) boxes = 'boxes' if amount > 1 else 'box' except ValueError: clear() controller.store.msg('You can only enter whole numbers') continue clear() text = f'You got {amount} {boxes} of {item} for ${total:.2f}' controller.store.msg(text) sleep(3) clear() elif option == 'q': break elif option == 'admin': clear() text = 'Options: 1 = add, 2 = delete, q = exit' controller.store.msg(text) while True: _ = input('Enter option: ') if _ not in ['1', '2', 'q']: clear() text = 'That option does not exist.\nOptions: 1 = add, 2 = delete, q = exit' controller.store.msg(text) continue if _ == '1': clear() controller.store.display(controller.product.items) text = 'Enter a single item and cost separated by a comma' controller.store.msg(text) item = input('>> ').split(',') if len(item) > 1 and len(item) < 3: try: price = float(item[1]) except ValueError: clear() controller.store.msg('Only numbers and floats are allowed.') sleep(3) clear() break controller.add(item[0], float(item[1])) clear() text = f'{item[0].title().strip()} has been added for ${float(item[1].strip()):.2f} a box.' controller.store.msg(text) sleep(3) clear() break else: clear() text = 'That is not the correct format\nEnter a single item and cost separated by a comma.\nOptions: 1 = add, 2 = delete, q = exit\n' controller.store.msg(text) sleep(2) continue if _ == '2': controller.store.display(controller.product.items) text = 'Enter the name of an item to be removed.' controller.store.msg(text) item = input('>> ') if item: action = controller.delete(item) if action: clear() text = f'{item.title()} has been removed' controller.store.msg(text) sleep(3) break else: clear() controller.store.display(controller.product.items) text = f'{item.title()} does not exist.\nOptions: 1 = add, 2 = delete, q = exit' controller.store.msg(text) else: clear() controller.store.display(controller.product.items) text = 'Error!\nOptions: 1 = add, 2 = delete, q = exit' controller.store.msg(text) continue if _ == 'q': controller.store.msg('Goodbye!') break else: clear() controller.store.msg('Error! That is not a valid option.') sleep(3) clear() |