Skip to content

Instantly share code, notes, and snippets.

@Adophilus
Created May 8, 2022 19:24
Show Gist options
  • Save Adophilus/0a5fdbcbeaf3a19dcec8084f8b938498 to your computer and use it in GitHub Desktop.
Save Adophilus/0a5fdbcbeaf3a19dcec8084f8b938498 to your computer and use it in GitHub Desktop.
A menu handler for console applications implemented using decorators in python3
class ConsoleMenu ():
options = []
question = ""
prompt = "Enter a selection: "
def __init__ (self, question: str, prompt: str = prompt):
self.question = question
self.prompt = prompt
def option (self, option: str):
def wrapper (function):
self.options.append([ option, function ])
return wrapper
def run (self, initial_input = False):
if (initial_input == False):
initial_input = input(self.question)
n_options = len(self.options)
for i in range(n_options):
print(f"{i + 1}. {self.options[i][0]}")
user_input = int(input(self.prompt))
if (not (user_input in range(0, n_options + 1))):
print("Input out of range!")
return self.run(initial_input)
self.options[user_input - 1][1](initial_input)
if __name__ == "__main__":
menu = ConsoleMenu("Enter a measurement in feet: ")
@menu.option("Convert to inches")
def convertToInches (user_input: int):
result = int(user_input) * 12
print(f"{result:.5f} inches")
@menu.option("Convert to yards")
def convertToYards (user_input: int):
result = int(user_input) / 3
print(f"{result:.5f} yards")
@menu.option("Convert to miles")
def convertToMiles (user_input: int):
result = int(user_input) / 5280
print(f"{result:.5f} miles")
@menu.option("Convert to millimetres")
def convertToMillimetres (user_input: int):
result = int(user_input) * 304.8
print(f"{result:.5f} mm")
@menu.option("Convert to centimetres")
def convertToCentimetres (user_input: int):
result = int(user_input) * 30.48
print(f"{result:.5f} cm")
@menu.option("Convert to metres")
def convertToMetres (user_input: int):
result = int(user_input) * 0.3048
print(f"{result:.5f} m")
@menu.option("Convert to kilometres")
def convertToKilometres (user_input: int):
result = int(user_input) * 0.0003048
print(f"{result:.5f} km")
menu.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment