On 24Sep2017 21:41, Daiyue Weng <daiyuew...@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 <c...@cskk.id.au> (formerly c...@zip.com.au)
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to