kalendarz, zmina ze słownika na liste

0

Witam, muszę napisać program na zaliczenie z programowania obietkowego w pythonie 3.
Prawie go skończyłem, ale pojawia się problem.
Gdy program wczytywał od użytkownika 2 informacje wszystko działało. Gdy dodałem opcje "Time" nagle rozsypało się zapisywanie wszystkiego w słowniku.
Ktoś może pomóc ?


class MenuCommand:
    def description(self):
        raise NotImplementedError

    def execute(self):
        raise NotImplementedError

class ExitCommand(MenuCommand):
    def __init__(self, menu):
        self._menu = menu

    def description(self):
        return "Exit"

    def execute(self):
        self._menu.stop()

class AddEventCommand(MenuCommand):
    def __init__(self, calendar):
        self._calendar = calendar

    def description(self):
        return "New event"

    def execute(self):
        title = input("Title: ")
        date = input("Date (DD.MM.YYYY): ")
        time = input("Time (HH:MM): ")
        self._calendar[title, date] = time

class ListAllCommand(MenuCommand):
    def __init__(self, calendar):
        self._calendar = calendar

    def description(self):
        return "List calendar"

    def execute(self):
        for title, date, time in self. _calendar.items():
            print(f"{title} - {date} - {time}")

class Menu:
    def __init__(self):
        self._commands = []
        self._should_running = True

    def add_command(self,cmd):
        self._commands.append(cmd)

    def run(self):
        while self._should_running:
            self._display_menu()
            self._execute_selected_command()
    def stop(self):
        self._should_running = False

    def _display_menu(self):
        for i, cmd in enumerate(self._commands):
            print("{}. {}".format(i + 1,cmd.description()))

    def _execute_selected_command(self):
        cmd_num = int(input("Select menu item (1-{}): " .format(len(self._commands))))
        cmd = self._commands[cmd_num - 1]
        cmd.execute()

def main():
    calendar = []
    menu = Menu()

    add_cmd = AddEventCommand(calendar)
    menu.add_command(add_cmd)

    list_all_cmd = ListAllCommand(calendar)
    menu.add_command(list_all_cmd)

    exit_cmd=ExitCommand(menu)
    menu.add_command(exit_cmd)

    menu.run()

main()
0

Co to znaczy rozsypało się?

0
Patryk27 napisał(a):

Co to znaczy rozsypało się?

Po wprowadzeniu tytułu, daty i czasu wywala program. Jakby nie zapisywał wgl tych informacji.

1

Co to znaczy wywala program?

Nie siedzę obok Ciebie, nie widzę Twojego ekranu, przez co nie mam pojęcia co wpisujesz ani jaki błąd konkretnie się pojawia.

0
Patryk27 napisał(a):

Co to znaczy wywala program?

Nie siedzę obok Ciebie, nie widzę Twojego ekranu, przez co nie mam pojęcia co wpisujesz ani jaki błąd konkretnie się pojawia.

title

1

No to tak: Twój calendar, którym potem karmisz AddEventCommand, to [] — czyli pusta lista. Możesz się odwoływać do jakichś numerowanych elementów listy, np. calendar[2] lub do numerowanych wycinków listy, czyli chociażby calendar[1:3], ale self._calendar[title, date] jest bez sensu — bo to ani nie liczba, ani nie zakres, tylko dwa stringi.

0
Althorion napisał(a):

No to tak: Twój calendar, którym potem karmisz AddEventCommand, to [] — czyli pusta lista. Możesz się odwoływać do jakichś numerowanych elementów listy, np. calendar[2] lub do numerowanych wycinków listy, czyli chociażby calendar[1:3], ale self._calendar[title, date] jest bez sensu — bo to ani nie liczba, ani nie zakres, tylko dwa stringi.

Mogłbym prosić o troszkę jaśniejszą odpowiedź ? Jestem na pierwszym roku w dodatku zaocznie i kod pisze spodarycznie, a teraz prawie wgl. bo zajęcia odwołane, a zdalnych nie mam.

1
  1. Mam duże wątpliwości czy to co wrzuciłeś jest przykładem poprawnego podejścia OOP dla zadanego przykładu.
  2. self._calendar[title, date] = time co to niby ma robić?
0

Nie wiem, czy potrafię jaśniej… Więc spróbuję na przykładach.

U Ciebie calendar, tak jak go definiujesz, to lista: kolekcja obiektów występujących kolejno po sobie. Na przykład: lista = ["Ala", "ma", "kota", "a", "kot", "ma", "Alę"]. Sens ma odwołanie do numerowanych elementów tej listy, na przykład lista[2] == "kota" (trzeci element listy — jako że te są numerowane od zera — to "kota"). Ma też sens odwołanie do jakiegoś ich zakresu, na przykład lista[1:4] == ["ma", "kota", "a"] (elementy od drugiego włącznie do piątego z wyłączeniem (czyli do czwartego włącznie) to ["ma", "kota", "a"]).
Ale nie ma sensu odwołanie na inny sposób: na przykład bez sensu jest lista["kot"] czy jeszcze bardziej lista["kot", "pies"] — a Ty właśnie takie odwołanie u siebie próbujesz zrobić.

0

Udało się naprawić problem z zapisywaniem w liście
W miejscu

self._calendar[title, date] = time

Trzeba było wpisać

self._calendar.append((title,date,time))

i skasować końcówkę .items()
z tego kawałka kodu
for title, date, time in self. _calendar.items():

0

Jeden problem opanowany i pojawia się następny. Tutaj brakuje mi po prostu wiedzy. Jakieś pomysły jak to mógłbym zrobić ?
title

1 użytkowników online, w tym zalogowanych: 0, gości: 1