创建菜单和子菜单显示

时间:2017-02-03 02:25:21

标签: python python-3.x menu menuitem submenu

我的主菜单有以下代码:

>>> def mainmenu ():
    d = ''
    while d == '':
        print ('\nM A I N   M E N U')
        print ('1. Settings')
        print ('q. Quit')
        option = input ('Select an option: ')
        if option.lower () == 'q':
            sys.exit ()
        elif option == '1':
            d = submenu ()
        else:
            print ('Invalid selection!')
    return d

>>> 

子菜单代码:

>>> def submenu ():
    p = ''
    while p == '':
        print ('\nS U B  M E N U')
        print ('1. Perform an action')
        print ('b. Back')
        print ('q. Quit')
        option = input ('Select an option: ')
        if option.lower () == 'q':
            sys.exit ()
        elif option.lower () == 'b':
            mainmenu ()
            return
        elif option == '1':
            p = 'Do something'
        else:
            print ('Invalid selection!')
    return p

>>> 

每当我从子菜单发出“返回”命令返回主菜单时,整个菜单系统就会崩溃。似乎父菜单继续停止调用另一个子菜单实例

p = ''

导致为空。

以下是所述错误的示例:

>>> value = mainmenu ()

M A I N   M E N U
1. Settings
q. Quit
Select an option: 1

S U B  M E N U
1. Perform an action
b. Back
q. Quit
Select an option: b

M A I N   M E N U
1. Settings
q. Quit
Select an option: 1

S U B  M E N U
1. Perform an action
b. Back
q. Quit
Select an option: 1
>>> 
>>> value
>>> 

但是,如果我从子菜单中选择“选项1”并且不使用“后退”选项,则一切都按预期工作。

>>> value = mainmenu ()

M A I N   M E N U
1. Settings
q. Quit
Select an option: 1

S U B  M E N U
1. Perform an action
b. Back
q. Quit
Select an option: 1
>>> 
>>> value
'Do something'
>>> 

如何修复“后退”选项功能?

我试图在主菜单的选项1下面插入一个return语句,以及我能想到的每个地方,但它没有用。我缺乏一些逻辑,非常感谢任何解释或帮助。

...
    elif option == '1':
            d = submenu ()
            return
...

更新1
- 在option =='1'下为mainmenu添加了一个变量“msg”并返回一个元组。

def mainmenu ():
    d = ''
    msg = ''    # Added in Update #1
    while d == '':
        print ('\nM A I N   M E N U')
        print ('1. Settings')
        print ('q. Quit')
        option = input ('Select an option: ')
        if option.lower () == 'q':
            sys.exit ()
        elif option == '1':
            msg = 'Option 1'    # Added in Update #1
            d = submenu ()
        else:
            print ('Invalid selection!')
    return msg, d    # Modified in Update #1

- 在main()

中解压缩并打印元组
message, action = mainmenu ()

print ('\nMessage: ', message)
print ('Action: ', action)

以下答案有效,但在选择选项'b'时引入了另一个问题。

M A I N   M E N U
1. Settings
q. Quit
Select an option: 1

S U B  M E N U
1. Perform an action
b. Back
q. Quit
Select an option: b

M A I N   M E N U
1. Settings
q. Quit
Select an option: 1

S U B  M E N U
1. Perform an action
b. Back
q. Quit
Select an option: 1

Message:  Option 1
Action:  ('Option 1', 'Do something')   # <<<<<< Return a Tuple?

该语句返回一个元组,我已经从main()中解压缩了它。这是一个未选择选项'b'的工作示例。

M A I N   M E N U
1. Settings
q. Quit
Select an option: 1

S U B  M E N U
1. Perform an action
b. Back
q. Quit
Select an option: 1

Message:  Option 1
Action:  Do something

2 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您正在返回None

elif option.lower () == 'b':
    mainmenu ()
    return

您的代码是递归调用mainmenu(),因此当您按1时,所有返回值都会爬回“top”,并且在该过程中您引入了NoneType

只需返回该功能即可。

elif option.lower () == 'b':
    return mainmenu ()

答案 1 :(得分:0)

如上所述,问题是子菜单中主菜单的递归调用。换句话说,子菜单每次创建主菜单的新实例,然后返回&#34;键是按下的。要解决它,只需返回主菜单而不调用另一个主菜单。

来自子菜单:

elif option.lower () == 'b':
    return

此方法将返回&#34;无&#34;对于主菜单,while循环将需要考虑到这一点。

def mainmenu ():
    d = None
    msg = ''
    while d is None:
    ....