Skip to content

Instantly share code, notes, and snippets.

@xslim
Created October 31, 2017 12:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xslim/c96413cdfbdf2b38c398cc291acb10a0 to your computer and use it in GitHub Desktop.
Save xslim/c96413cdfbdf2b38c398cc291acb10a0 to your computer and use it in GitHub Desktop.
Python Menu 1
class Menu(object):
def __init__(self, title=None, options=None, message=None,
refresh=lambda: None, println=lambda: None, printend=lambda: None,
clear=lambda: None, iinput=lambda: None):
if options is None:
options = []
self.options = None
self.title = None
self.is_title_enabled = None
self.message = None
self.is_message_enabled = None
self.is_open = None
self.set_options(options)
self.set_title(title)
self.set_title_enabled(True)
self.set_message(message)
self.set_message_enabled(message is not None)
def set_options(self, options):
original = self.options
self.options = []
try:
for option in options:
if not isinstance(option, tuple):
raise TypeError(option, "option is not a tuple")
if len(option) != 2:
raise ValueError(option, "option is not of length 2")
self.add_option(option[0], option[1])
except (TypeError, ValueError) as e:
self.options = original
raise e
def set_title(self, title):
self.title = title
def set_title_enabled(self, is_enabled):
self.is_title_enabled = is_enabled
def set_message(self, message):
self.message = message
def set_message_enabled(self, is_enabled):
self.is_message_enabled = is_enabled
def add_option(self, name, handler):
if not callable(handler):
raise TypeError(handler, "handler is not callable")
self.options += [(name, handler)]
def refresh(self): pass
def println(self, text=''): pass
def printend(self): pass
def clear(self): pass
def iinput(self): return None
# open the menu
def open(self):
self.is_open = True
while self.is_open:
self.refresh()
func = self.input()
if func == Menu.CLOSE:
func = self.close
# print()
func()
def close(self):
self.is_open = False
# clear the screen
# show the options
def show(self):
# os.system('cls' if os.name == 'nt' else 'clear')
self.clear()
if self.is_title_enabled:
self.println(self.title)
self.println()
if self.is_message_enabled:
self.println(self.message)
self.println()
for (index, option) in enumerate(self.options):
self.println(str(index + 1) + ". " + option[0])
self.printend()
# show the menu
# get the option index from the input
# return the corresponding option handler
def input(self):
if len(self.options) == 0:
return Menu.CLOSE
try:
self.show()
index = int(self.iinput()) - 1
return self.options[index][1]
except (ValueError, IndexError):
return self.input()
def CLOSE(self):
pass
from __future__ import print_function
import os
from menu import Menu
class MenuScreen(Menu):
def println(self, text=''):
print(text)
def printend(self):
print()
def clear(self):
os.system('cls' if os.name == 'nt' else 'clear')
def iinput(self):
return int(raw_input(">>> "))
from menu_screen import MenuScreen
menu = MenuScreen("Menu", message="Message text")
sub = MenuScreen("Submenu")
menu.set_options([
("Open submenu", sub.open),
("Close main menu", menu.close)
])
sub.set_options([
("Return to main menu", sub.close)
])
menu.open()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment