【问题标题】:Menu and submenu python菜单和子菜单 python
【发布时间】:2019-04-08 08:13:00
【问题描述】:

如何从子菜单返回到主菜单? 另外我想保留子菜单中生成的数据。

主菜单:

1.加载数据 2.过滤数据 3.显示统计 4. 生成图 5. 退出

关于选项 2,我有一个子菜单:

1. S. enterica 2. 蜡状芽孢杆菌 3.李斯特菌 4. B. thermosphacta 5. 退出
def mainMenu():  
    menuItems = np.array(["Load data", "Filter data", "Display statistics", "Generate plots", "Quit"])
    while True:
        choice = displayMenu(menuItems)
        if choice == 1:
            filename = input("Please enter filename: ")
            data = dataLoad(filename)
        elif choice == 2:
            menuItems = np.array(["S. enterica", "B. cereus", "Listeria", "B. thermosphacta", "Quit"])
            while True: 
                choice = displayMenu(menuItems)
                if choice == 1:
                    data = data[data[:,2] == 1] # 1 - S. enterica
                elif choice == 2:    
                    data = data[data[:,2] == 2] # 2 - B. cereus
                elif choice == 3:   
                    data = data[data[:,2] == 3]  # 3 - Listeria
                elif choice == 4:    
                    data = data[data[:,2] == 4] # 4 - B. thermosphacta
                elif choice == 5:
                    return data
                continue
        if choice == 3:
            statistic = input("Please enter statistic: ")
            print (dataStatistics(data, statistic))
        elif choice == 4:
            dataPlot(data)
        elif choice == 5:
            break

【问题讨论】:

  • 请详细说明您想要什么,以及发布的代码与它的关系。
  • 谢谢,我修改了代码。我希望它现在更清楚。在“elif 选择 == 2:返回数据继续”上,我想返回 mainMenu()。
  • 如果您大幅更改您的问题,您可能会使那些努力帮助您解决原始问题的人的努力无效。仅通过附加附加或更正信息来更改问题是一种很好的做法,并使用 "Edit:""Append:" 等术语介绍它们。
  • 谢谢。我对其进行了修改以使其更易于理解。使用的本质和功能是相同的。仅更改了代码的变量和长度。

标签: python loops recursion while-loop bioinformatics


【解决方案1】:

用这个替换你的代码:

def mainMenu():  
    mainMenuItems = np.array(["Load data", "Filter data", "Display statistics", 
                              "Generate plots", "Quit"])
    subMenuItems  = np.array(["S. enterica", "B. cereus", "Listeria", 
                              "B. thermosphacta"])
    while True:
        choice = displayMenu(mainMenuItems)
        if choice == 1:
            filename = input("Please enter filename: ")
            data = dataLoad(filename)
        elif choice == 2:
            while True: 
                subchoice = displayMenu(subMenuItems)
                if subchoice in (1, 2, 3, 4):
                    data = data[data[:,2] == subchoice]
                    break 
                # The answer is not a correct one
                continue
        elif choice == 3:     # instead of if
            statistic = input("Please enter statistic: ")
            print (dataStatistics(data, statistic))
        elif choice == 4:
            dataPlot(data)
        elif choice == 5:
            break

您的子菜单中不需要“退出”选项 - 您只想在错误答案的情况下重复嵌套循环(子菜单)(其他为 1、2、3或 4)。

不需要任何操作来保存data 变量的内容,因为您执行的所有操作都在您的mainMenu() 函数内。但是,如果您在函数之外需要它,请在函数中使用return data 语句作为最后一个,在任何循环之外。

【讨论】:

  • 感谢您的回答。您提高了我的代码的可读性。然而,解决方案是缺失的。在选项 1 的主菜单上,有一种数据,在子菜单上有其他数据。我确实需要一个 QUIT 或返回到 mainMenu() 选项。在您的解决方案中,我被困在子菜单循环中。
  • 是的,您可能似乎被困在嵌套循环中,但实际上您被“困”在主循环中 ,因为您在主循环和嵌套循环中也使用了同名 (menuItems) - 并且嵌套循环用嵌套菜单覆盖主菜单。一开始我没有注意到。所以我编辑了我的答案,现在我使用了不同的名称(mainMenuItemssubMenuItems)。
  • 如果我的回答对你有用,你可以投票赞成,即使你对它并不完全满意。
【解决方案2】:

我在子菜单中实现了 break 语句,并将 menuItems 放在循环中。这很有效,并且在子菜单(子选项)中创建的数据可以在 mainMenu 选项 3 和 4 中使用。

import numpy as np
from displayMenu import *
from dataLoad import *
from dataStatistics import *
from dataPlot import *
from bFilter import *

def mainMenu():  
while True:
    menuItems = np.array(["Load data", "Filter data", "Display statistics",
                          "Generate plots", "Quit"])
    choice = displayMenu(menuItems)
    if choice == 1:
        filename = input("Please enter filename: ")
        data = dataLoad(filename)
    elif choice == 2:
        while True:
            menuItems = np.array(["S. enterica", "B. cereus", "Listeria", 
                                 "B. thermosphacta", "Back to main menu"])
            subchoice = displayMenu(menuItems)
            if subchoice in (1, 2, 3, 4):
                data = data[data[:,2] == subchoice]
            if subchoice == 5:
                break 
            continue
    elif choice == 3:
        statistic = input("Please enter statistic: ")
        print (dataStatistics(data, statistic))
    elif choice == 4:
        dataPlot(data)
    elif choice == 5:
        break

【讨论】:

    猜你喜欢
    • 2023-01-23
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多