python console menu level looping
Daiyue Weng
daiyueweng at gmail.com
Sun Sep 24 17:35:29 EDT 2017
Sry for the unclear formatting, this is the original code with correct
format (copy from pycharm),
print('insert data into: ')
data_insert_method = ['new collection', 'existing collection']
for index, elem in enumerate(data_insert_method):
print(index, '-', elem)
while 1:
how_to_insert = input('Choose a method for inserting data: ')
if how_to_insert:
try:
how_to_insert = int(how_to_insert)
how_to_insert = data_insert_method[how_to_insert]
break
except ValueError:
print('Please type in an integer corresponding to the data
insert method')
continue
except IndexError:
print('insert method index out of range')
continue
if how_to_insert == 'new collection':
print('Set up collection name : ')
db_name_setup = ['manual setup', 'return to main menu']
for index, elem in enumerate(db_name_setup):
print(index, '-', elem)
while 1:
how_to_setup = input('Choose a method for setting up collection: ')
if how_to_setup:
try:
how_to_setup = int(how_to_setup)
how_to_setup = db_name_setup[how_to_setup]
break
except ValueError:
print('Please type in an integer corresponding to the
collection setup method')
continue
except IndexError:
print('db name setup method index out of range')
continue
if how_to_setup == 'manual setup':
print('Please type in collection name ')
elif how_to_setup == 'return to main menu':
print('return to main menu')
On 24 September 2017 at 22:11, Cameron Simpson <cs at cskk.id.au> wrote:
> On 24Sep2017 21:41, Daiyue Weng <daiyueweng at gmail.com> wrote:
>
>> Hi, I tried to make a menu using print statements in Python 3. The code is
>> as follows,
>>
>
> One thing, please try to preserve the code indenting in messages. What you
> pasted is all hard against the left side of the screen. I've tried to
> repair it.
>
> print('insert data into: ')
>> data_insert_method = ['new collection', 'existing collection']
>> for index, elem in enumerate(data_insert_method):
>> print(index, '-', elem)
>>
>> while 1:
>>
>
> Remark: we tend to say "while True:", it reads more naturally.
>
> how_to_insert = input('Choose a method for inserting data: ')
>> if how_to_insert:
>> try:
>> how_to_insert = int(how_to_insert)
>> how_to_insert = data_insert_method[how_to_insert]
>> break
>> except ValueError:
>> print('Please type in an integer corresponding to the data insert
>> method')
>> continue
>> except IndexError:
>> print('insert method index out of range')
>> continue
>>
>
> Another remark: it is better to keep try/except around as small a piece of
> code as possible; I'd use two here, one for ValueError around the int() and
> one for IndexError around the [].
>
>
> if how_to_insert == 'new collection':
>> print('Set up collection name : ')
>> db_name_setup = ['manual setup', 'return to the main menu']
>> for index, elem in enumerate(db_name_setup):
>> print(index, '-', elem)
>> while 1:
>> how_to_setup = input('Choose a method for setting up collection: ')
>> if how_to_setup:
>> try:
>> how_to_setup = int(how_to_setup)
>> how_to_setup = db_name_setup[how_to_setup]
>> break
>> except ValueError:
>> print('Please type in an integer corresponding to the collection
>> setup method')
>> continue
>> except IndexError:
>> print('collection setup method index out of range')
>> continue
>> if how_to_setup == 'manual setup':
>> print('Please type in collection name: ')
>> elif how_to_setup == 'return to main menu':
>> print('return to main menu')
>>
>> It is a 2-level menu, on the 2nd level menu 'new collection', there is an
>> option - 'return to the main menu', I am wondering how to loop back to the
>> 1st level menu, i.e. ['new collection', 'existing collection'],
>> whenever 'return to the main menu' is selected.
>>
>
> This is where the lack of indentation in your posted code bites; I've just
> realised I've misread your logic because I misindented your code :-( Your
> "while 1:" is just a loop around the input question, not around the menu
> choices.
>
> I would go with a flag, and use it as your loop condition. Like this:
>
> running_inner_menu = True
> while running_inner_menu:
>
> So something like this (untested):
>
> if how_to_insert == 'new collection':
> running_inner_menu = True
> while running_inner_menu:
> print('Set up collection name : ')
> db_name_setup = ['manual setup', 'return to the main menu']
> for index, elem in enumerate(db_name_setup):
> print(index, '-', elem)
> # obtain a valid choice
> while 1:
> how_to_setup = input('Choose a method for setting up collection: ')
> if how_to_setup:
> try:
> how_to_setup = int(how_to_setup)
> how_to_setup = db_name_setup[how_to_setup]
> break
> except ValueError:
> print('Please type in an integer corresponding to the
> collection setup thod')
> continue
> except IndexError:
> print('collection setup method index out of range')
> continue
> if how_to_setup == 'manual setup':
> print('Please type in collection name: ')
> ... etc ...
> elif how_to_setup == 'return to main menu':
> print('return to main menu')
> running_inner_menu = False
>
> All this depends a little on how your code was originally indented i.e.
> exactly which portions of the code were within each while loop. I've
> guessed at something reasonable, but can see that there's room for
> different arrangements.
>
> But basicly, keep a state variable indicating that a loop should continue.
> As a piece of terminology, a Boolean (True/False) state variable is often
> called a flag.
>
> This has two advantages:
>
> It means you can turn it off anywhere and next time around the loop will
> stop, whereas doing things directly with continue or break requires
> "structural" control because they only jump out of the innermost loop, and
> also they act right now, preventing other relevant stuff being done.
>
> Also it makes your code more readable and easier to reason able: a loop
> which says "while running_inner_menu:" directly says that this loop
> controls a repeating menu, and that you can get out by changing
> "running_inner_menu". A bare "while 1:" or "while True:" requires the
> reader to have to scan the code to figure out what is being controlled.
>
> Cheers,
> Cameron Simpson <cs at cskk.id.au> (formerly cs at zip.com.au)
>
More information about the Python-list
mailing list