Guest User

Untitled

a guest
Apr 11th, 2023
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.24 KB | None | 0 0
  1. from collections import OrderedDict
  2. from pprint import pprint
  3. import sys
  4. import os
  5. import pickle
  6.  
  7. class Меню:
  8.     def __init__(self, название):
  9.         self.название = название
  10.         self.меню_и_пункты = OrderedDict()
  11.         self.__name__ = self.название
  12.        
  13. class Пункт:
  14.     def __init__(self, название, значение = None):
  15.         self.название = название
  16.         self.значение = значение
  17.         self.__name__ = self.название
  18.        
  19. class Консоль():
  20.     def __init__(self):
  21.         self.предыдущий_пункт = []
  22.         self.текущий_пункт = None
  23.  
  24.     def цикл(self):
  25.         while 1:
  26.             консоль.clear_screen()
  27.             self.отобразить_пункты()
  28.             выбор = input('>>> ')
  29.             if выбор:
  30.                 self.выбрать_пункт(выбор)
  31.            
  32.     def создать_главное_меню(self, название):
  33.         self.меню = Меню(название)      
  34.         self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.создать_меню
  35.         self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.создать_пункт
  36.         self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.назад
  37.         self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.выход
  38.         self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.сохранить
  39.         self.меню.меню_и_пункты[len(self.меню.меню_и_пункты)+1] = Консоль.загрузить
  40.         self.текущий_пункт = self.меню
  41.        
  42.     def создать_меню(self, название):
  43.         if not название:
  44.             return
  45.         if 'меню' in (dir(self)):
  46.             self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)+1] = Меню(название)
  47.             размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
  48.             self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.создать_меню
  49.             размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
  50.             self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.создать_пункт
  51.             размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
  52.             self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.назад
  53.             размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
  54.             self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.выход
  55.             размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
  56.             self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.сохранить
  57.             размер = len(self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты)
  58.             self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)].меню_и_пункты[размер+1] = Консоль.загрузить
  59.         else:
  60.             pass
  61.            
  62.     def создать_пункт(self, название):
  63.         if название:
  64.             self.текущий_пункт.меню_и_пункты[len(self.текущий_пункт.меню_и_пункты)+1] = Пункт(название)
  65.        
  66.     def отобразить_пункты(self):
  67.         print('')
  68.         print(self.текущий_пункт.название)
  69.         if 'меню' in (dir(self)):
  70.             for key in self.текущий_пункт.меню_и_пункты.keys():
  71.                 s = str(type(self.текущий_пункт.меню_и_пункты[key])).replace("'", '').replace('__main__', '')
  72.                 s = s.replace('.', '').replace('function', 'команда').replace('class', '')
  73.                 print(str(key)+'.) '+self.текущий_пункт.меню_и_пункты[key].__name__+'\t' + s)
  74.                
  75.     def выбрать_пункт(self, выбор):
  76.         def f():pass
  77.         if выбор:
  78.             выбор = int(выбор)
  79.             if выбор in self.текущий_пункт.меню_и_пункты.keys():
  80.                 if type(self.текущий_пункт.меню_и_пункты[выбор]) == Меню:
  81.                     self.предыдущий_пункт.append(self.текущий_пункт)
  82.                     self.текущий_пункт = self.текущий_пункт.меню_и_пункты[выбор]
  83.                     return
  84.  
  85.                 if type(self.текущий_пункт.меню_и_пункты[выбор]) == type(f):
  86.                     название = input('>>> '+self.текущий_пункт.меню_и_пункты[выбор].__name__+' >>> ')
  87.                     self.текущий_пункт.меню_и_пункты[выбор](self, название)
  88.                     return
  89.  
  90.                 пункт = self.текущий_пункт.меню_и_пункты[выбор]
  91.                 if type(пункт) == Пункт:
  92.                     print(self.текущий_пункт.меню_и_пункты[выбор].значение)
  93.                     значение = input('>>> значение >>> ')
  94.                     if значение:
  95.                         self.текущий_пункт.меню_и_пункты[выбор].значение = значение
  96.                         return
  97.                        
  98.     def назад(self, название):
  99.         if len(self.предыдущий_пункт):
  100.             self.текущий_пункт = self.предыдущий_пункт[-1]
  101.             self.предыдущий_пункт = self.предыдущий_пункт[:-1]
  102.            
  103.     def выход(self, название):
  104.         if название:
  105.             return
  106.         sys.exit()
  107.     def clear_screen(self):
  108.         clear = 'cls' if os.name == 'nt' else 'clear'
  109.         os.system(clear)
  110.        
  111.     def сохранить(self, название):
  112.         if not название:
  113.             название = 'file.pickle'
  114.         try:    
  115.             with open(название, 'wb') as f:
  116.                 pickle.dump(self, f)
  117.         except FileNotFoundError:
  118.             pass
  119.            
  120.     def загрузить(self, название):
  121.         if not название:
  122.             название = 'file.pickle'
  123.         try:
  124.             with open(название, 'rb') as f:
  125.                 консоль = pickle.load(f)
  126.                 консоль.цикл()
  127.         except FileNotFoundError:
  128.             pass
  129.            
  130. консоль = Консоль()
  131. консоль.создать_главное_меню('главное_меню')
  132. консоль.цикл()
  133.  
  134.    
  135.    
  136.  
Advertisement
Add Comment
Please, Sign In to add comment