Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from collections import OrderedDict
- from pprint import pprint
- import sys
- import os
- import pickle
- class Меню:
- def __init__(self, название):
- self.название = название
- self.меню_и_пункты = OrderedDict()
- self.__name__ = self.название
- class Пункт:
- def __init__(self, название, значение = None):
- self.название = название
- self.значение = значение
- self.__name__ = self.название
- class Консоль():
- def __init__(self):
- self.предыдущий_пункт = []
- self.текущий_пункт = None
- def цикл(self):
- while 1:
- консоль.clear_screen()
- self.отобразить_пункты()
- выбор = input('>>> ')
- if выбор:
- self.выбрать_пункт(выбор)
- def создать_главное_меню(self, название):
- self.меню = Меню(название)
- self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.создать_меню
- self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.создать_пункт
- self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.назад
- self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.выход
- self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.сохранить
- self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.загрузить
- self.текущий_пункт = self.меню
- def создать_меню(self, название):
- if not название:
- return
- if 'меню' in (dir(self)):
- self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)+1] = Меню(название)
- размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
- self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.создать_меню
- размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
- self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.создать_пункт
- размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
- self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.назад
- размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
- self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.выход
- размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
- self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.сохранить
- размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
- self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.загрузить
- else:
- pass
- def создать_пункт(self, название):
- if название:
- self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)+1] = Пункт(название)
- def отобразить_пункты(self):
- print('')
- print(self.текущий_пункт.название)
- if 'меню' in (dir(self)):
- for key in self.текущий_пункт.меню_и_пункты.keys():
- s = str(type(self.текущий_пункт.меню_и_пункты[key])).replace("'", '').replace('__main__', '')
- s = s.replace('.', '').replace('function', 'команда').replace('class', '')
- print(str(key)+'.) '+self.текущий_пункт.меню_и_пункты[key].__name__+'\t' + s)
- def выбрать_пункт(self, выбор):
- def f():pass
- if выбор:
- выбор = int(выбор)
- if выбор in self.текущий_пункт.меню_и_пункты.keys():
- if type(self.текущий_пункт.меню_и_пункты[выбор]) == Меню:
- self.предыдущий_пункт.append(self.текущий_пункт)
- self.текущий_пункт = self.текущий_пункт.меню_и_пункты[выбор]
- return
- if type(self.текущий_пункт.меню_и_пункты[выбор]) == type(f):
- название = input('>>> '+self.текущий_пункт.меню_и_пункты[выбор].__name__+' >>> ')
- self.текущий_пункт.меню_и_пункты[выбор](self, название)
- return
- пункт = self.текущий_пункт.меню_и_пункты[выбор]
- if type(пункт) == Пункт:
- print(self.текущий_пункт.меню_и_пункты[выбор].значение)
- значение = input('>>> значение >>> ')
- if значение:
- self.текущий_пункт.меню_и_пункты[выбор].значение = значение
- return
- def назад(self, название):
- if len(self.предыдущий_пункт):
- self.текущий_пункт = self.предыдущий_пункт[-1]
- self.предыдущий_пункт = self.предыдущий_пункт[:-1]
- def выход(self, название):
- if название:
- return
- sys.exit()
- def clear_screen(self):
- clear = 'cls' if os.name == 'nt' else 'clear'
- os.system(clear)
- def сохранить(self, название):
- if not название:
- название = 'file.pickle'
- try:
- with open(название, 'wb') as f:
- pickle.dump(self, f)
- except FileNotFoundError:
- pass
- def загрузить(self, название):
- if not название:
- название = 'file.pickle'
- try:
- with open(название, 'rb') as f:
- консоль = pickle.load(f)
- консоль.цикл()
- except FileNotFoundError:
- pass
- консоль = Консоль()
- консоль.создать_главное_меню('главное_меню')
- консоль.цикл()
Advertisement
Add Comment
Please, Sign In to add comment