简体   繁体   中英

Both if statements and the else printing out, however, none of it is getting the url database

This program is a console application that displays an Application Title and the Menu Options for the user, displays a list of recipe categories (ie Beef, Chicken, Vegan, Side, Desert, etc.), displays a list of meals based on a user selected category, and displays meal information (Directions) based on a user selected meal. I only need help with displaying the list of meals for the user selected category.

I am using a website that provides free JSON API's for this program that all work fine. The program shows the categories and recipes but wont show the individual meals for each of the category. Its weird because I put print() statements after the if statements in the function where it gets the meals by category to try to debug it but, it prints both the pint(1) and print(2) statements so it does the getting stuff right but still also prints the else statement. This section of code is part of the recipes.py file (found under) in the search_meal_by_categories function. This is what I put in to debug it to figure out why it prints out both the if and else:

def search_meal_by_category(categories):
    lookup_category = input("Enter a category: ")
    found = False

    for i in range(len(categories)):
        category = categories[i]
        if category.get_category().lower() == lookup_category.lower():
            found = True
            print(1)

        if found:
            meals = requests.get_meals_by_category(lookup_category)
            list_meals_by_category(lookup_category, meals)
            print(2)

        else:
            print("Invalid Category, please try again")

Its very weird because it shows the recipe if you type it is but not the meals in that category. In the command menu you can: ("1 - List all Categories") ("2 - List all Meals for a Category") ("3 - Search Meal by Name") ("0 - Exit the program") Thus far, I can put in the command 1 and 3 but not 2 or 0. There are 3 different python files for this and I included each of the 3 with only that specific meals by category function from each file to make it easier (I hope?).

Basically, the goal is to ask the program to show each meal in the category you type in. Thus far, it only shows the categories and a recipes instructions if you type in the name of the recipe. However, I dint include that since its working fine.

(object.py file)

    class Category:
    def __init__(self, category):
        self.__category = category

    def get_category(self):
        return self.__category

    def set_category(self, category):
        self.__category = category

class Meal:
    def __init__(self, meal_id, meal, meal_thumb):
        self.__meal_id = meal_id
        self.__meal = meal
        self.__meal_thumb = meal_thumb

    def get_meal_id(self):
        return self.__meal_id

    def set_meal_id(self, meal_id):
        self.__meal_id = meal_id

    def get_meal(self):
        return self.__meal

    def set_meal(self, meal):
        self.__meal = meal

    def get_meal_thumb(self):
        return self.__meal_thumb

    def set_meal_thumb(self, meal_thumb):
        self.__meal_thumb = meal_thumb

(requests.py file)

    from urllib import request, parse
import json

from objects import Category, Meal


def get_categories():
    url = 'https://www.themealdb.com/api/json/v1/1/list.php?c=list'
    f = request.urlopen(url)
    categories = []

    try:
        data = json.loads(f.read().decode('utf-8'))
        for category_data in data['meals']:
            category = Category(category_data['strCategory'])

            categories.append(category)
    except (ValueError, KeyError, TypeError):
        print("JSON format error")

    return categories


def get_meals_by_category(category):
    url = 'https://www.themealdb.com/api/json/v1/1/filter.php?c=Seafood' + category
    f = request.urlopen(url)
    meals = []

    try:
        data = json.loads(f.read().decode('utf-8'))
        for meal_data in data['meals']:
            category = Meal(meal_data['idMeal'],
                            meal_data['strMeal'],
                            meal_data['strMealThumb'])

            meals.append(category)
    except (ValueError, KeyError, TypeError):
        print("JSON Format error")

    return meals
    

This is the last file of the 3 and I think where the problem lies. I put a print(1), print(2) statement after each if and it printed out both those AND the else statement? Basically, all it shows right now is "Invalid Category, please try again" like 10 times.

   import requests


def show_title():
    print("My recipes Program")
    print()


def show_menu():
    print("COMMAND MENU")
    print("1 - List all Categories")
    print("2 - List all Meals for a Category")
    print("3 - Search Meal by Name")
    print("0 - Exit the program")
    print()


def list_categories(categories):
    print("CATEGORIES")
    for i in range(len(categories)):
        category = categories[i]
        print(category.get_category())
    print()


def list_meals_by_category(category, meals):
    print(category.upper() + " MEALS ")
    for i in range(len(meals)):
        meal = meals[i]
        print(meal.get_meal())
    print()


def search_meal_by_category(categories):
    lookup_category = input("Enter a category: ")
    found = False

    for i in range(len(categories)):
        category = categories[i]
        if category.get_category().lower() == lookup_category.lower():
            found = True
            break

        if found:
            meals = requests.get_meals_by_category(lookup_category)
            list_meals_by_category(lookup_category, meals)
        else:
            print("Invalid Category, please try again")

Please comment if you need any more information, this is my first time doing a python project this big (I know this may seem very easy to everyone because everyone on here is a genius). I have genuinely been staring at this for 2 days now. Thanks everyone for any help!

Did you mean to write this:

def search_meal_by_category(categories):
    lookup_category = input("Enter a category: ")
    found = False

    for i in range(len(categories)):
        category = categories[i]
        if category.get_category().lower() == lookup_category.lower():
            found = True
            break

    if found:
        meals = requests.get_meals_by_category(lookup_category)
        list_meals_by_category(lookup_category, meals)
    else:
        print("Invalid Category, please try again")

I have unindented the if found: part, so that when you get the found = True; break found = True; break then it skips the rest of the for and detects found .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM