【问题标题】:How to create a python menu where the options are selectable and unselectable?如何创建一个python菜单,其中选项是可选择的和不可选择的?
【发布时间】:2022-10-14 22:52:04
【问题描述】:

我想创建一个带有编号的菜单选项的 python 菜单,当您选择其中一个选项时,旁边会出现一个 x 以表明该特定选项已被选中。然后,如果用户再次选择该选项,我希望 x 消失以表明该选项不再被选中。

以下是我希望我的程序执行的示例图像:

  1. The Menu is blank.

  2. The option that was selected has a little x next to it.

  3. When selected again, the option becomes blank again.

    到目前为止,这是我的测试代码:

    test = print("1. Normal Character Generator({})".format(""))
    test2 = print("2. Advanded Appearance Generator({})".format(""))
    
    
    def normalGenerationTrue():
        test = print("1. Normal Character Generator({})".format("X"))
    
    
    while True:
        try:
            selection = int(input("Please choose one of the menu options.\n"))
    
            if selection == 1:
                normalGenerationTrue()
                new = input("Would you like to make another selection?").lower()
                if new == "yes":
                    print(test)
                elif new == "no":
                    break
            elif selection == 2:
                advancedGenerationTrue()
                break
            else:
                print("Invalid Choice. Enter one of the menu numbers.")
                test = print("1. Normal Character Generator({})".format(""))
                test2 = print("2. Advanded Appearance Generator({})".format(""))
        except ValueError:
            print("Invalid Choice. Enter one of the menu numbers.")
    
    

【问题讨论】:

  • 首先,您应该保留一些变量,然后选择哪个元素,然后您应该使用if/else与菜单上的每个元素来检查它是否需要X。或者,您应该将此信息保留在某个列表中 - 对于每个元素,保留 X 或空字符串。
  • print() 总是给出None - 所以分配test = print(...) 是没有用的,因为它总是意味着test = None。如果您想将文本分配给变量,那么您应该直接使用test = "1....".format("")。然后打印它print(test)。但是你应该使用变量"1....".format(variable_for_menu_1) 来改变它。
  • 顺便说一句:在许多程序中,我在[ ] 的行首看到(我更喜欢)X - 就像[X] 1. ... 和下一行[ ] 2. ... - 这样所有[X] [ ] 都相同柱子。

标签: python python-3.x


【解决方案1】:

您应该将菜单保留在列表中

menu = [
   "1. Normal Character Generator",
   "2. Advanded Appearance Generator",
]

并将最后选择保留在变量中(0 表示不选择)

selected = 0

稍后您可以使用这两个值来显示带有或不带有X 的菜单

def display_menu(menu, selected):
    for number, item in enumerate(menu, 1):
        if number == selected:
            print('(X)', item)
        else:
            print('( )', item)

稍后您必须将新值分配给selected

while True:
    display_menu(menu, selected)

    try:
        # don't assign directly to `selected` because user may choose wrong number
        new_selection = int(input("Please choose one of the menu options.
"))

        if new_selection in (1, 2):
            # assign to `selected` when user choose correct number
            selected = new_selection

            display_menu(menu, selected)
 
            new = input("Would you like to make another selection? [Y/n]").lower()

            if new in ("n", "no"):
                break
        else:
            print("Invalid Choice. Enter one of the menu numbers.")
    except ValueError:
        print("Invalid Choice. Enter one of the menu numbers.")

顺便提一句:

我将(X)( ) 放在行首,因为它更具可读性 - 许多程序将它放在行首(类似于 GUI 中的复选框)。

在第二个问题中,我还检查了n,因为只写n 而不是no 更简单。许多程序都这样做。

我还使用文本[Y/n](类似于其他程序)来显示可能的选择-ny。上面的Y 是通知用户这是默认值的流行方法,如果他/她只按Enter(不输入y)将使用该值。


完整代码:

menu = [
    "1. Normal Character Generator",
    "2. Advanded Appearance Generator",
]

selected = 0

def display_menu(menu, selected):
    for number, item in enumerate(menu, 1):
        if number == selected:
            print('(X)', item)
        else:
            print('( )', item)
    
while True:
    display_menu(menu, selected)

    try:
        # don't assign directly to `selected` because user can choose wrong number
        new_selection = int(input("Please choose one of the menu options.
>> "))

        if new_selection in (1, 2):
            # assign to `selected` because it it correct number
            selected = new_selection

            display_menu(menu, selected)
 
            new = input("Would you like to make another selection? [Y/n]
>> ").lower()

            if new in ("n", "no"):
                break
        else:
            print("Invalid Choice. Enter one of the menu numbers.")
    except ValueError:
        print("Invalid Choice. Enter one of the menu numbers.")

结果:

( ) 1. Normal Character Generator
( ) 2. Advanded Appearance Generator
Please choose one of the menu options.
>> 1
(X) 1. Normal Character Generator
( ) 2. Advanded Appearance Generator
Would you like to make another selection? [Y/n]
>> 
(X) 1. Normal Character Generator
( ) 2. Advanded Appearance Generator
Please choose one of the menu options.
>> 2
( ) 1. Normal Character Generator
(X) 2. Advanded Appearance Generator
Would you like to make another selection? [Y/n]
>> y
( ) 1. Normal Character Generator
(X) 2. Advanded Appearance Generator
Please choose one of the menu options.
>> 1
(X) 1. Normal Character Generator
( ) 2. Advanded Appearance Generator
Would you like to make another selection? [Y/n]
>> n

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 2016-12-12
    • 2011-02-18
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多