Instantly share code, notes, and snippets.
-
Save xslim/c96413cdfbdf2b38c398cc291acb10a0 to your computer and use it in GitHub Desktop.
Python Menu 1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(">>> ")) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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