AttributeError: 'program' object has no attribute 't'

Максим Грушин

Пользователь
Пользователь
Апр 10, 2020
63
8
8
19
Тюмень
Темы нужно оформить по правилам форума.
Здравствуйте, вот проблема:
Python:
Traceback (most recent call last):
  File "Napominalka.py", line 109, in <module>
    actions[x]()
  File "Napominalka.py", line 90, in <lambda>
    "1": lambda: program.deadline(),
  File "Napominalka.py", line 60, in deadline
    if self.now >= self.t:
AttributeError: 'program' object has no attribute 't'
Хотя эта переменная есть, и хз почему не работает
Python:
import pickle
from datetime import datetime, date, time
import datetime
import time
import sys
import os


saved_name = None
try:
    with open("user.txt", "r", encoding="utf-8") as f:
        saved_name = f.read()
except:
    pass

if saved_name:
    print("Добрый день", saved_name)
else:
    print("Добрый день, как вас зовут?")
    name = input("Введите ваше имя\n|>")
    with open("user.txt", "w", encoding="utf-8") as f:
        f.write(name)

                #Класс для облегчение программы
class program():
    data = {}
   
                #Функции для облегчение строение программы
    def new(self):
        self.clear = lambda: os.system("cls")
        self.clear()

        print("'''Создание напоминание'''")
        print("Как называется напоминание?")
        self.text = input(">")

        with open("self.text.pickle", "wb") as f:
            pickle.dump(self.text, f)

        print("Укажите время и дату")
       
        self.t = input("Вводите время в стиле ЧЧММCС\nВводите дату в стиле ДД/ММ/ГГГГ\n>")
        self.t = datetime.datetime.strptime(self.t, "%H:%M:%S %d/%m/%Y")

        print("Вы указали на:\n>", t)
   
    def view(self):
        print("<Список напоминаний>")
        print("====")
        with open("self.text.pickle", "rb") as f:
            self.text_new = pickle.load(f)
        print(self.text_new)
        print("=====================")
   
       
    def deadline(self):
        while True:
            self.now = datetime.datetime.now()
            print("Сейчас время:".format(self.now.strftime("%d/%m/%Y %H:%M:%S")))
            if self.now >= self.t:
                print("Время вышло\n>", self.now)
                break
            time.sleep(1)

               
       
    #def delete(self):
       


    #def save(self):
        #with open("data.pickle", "wb") as f:


    def exit(self):
        print("=====================")
        print("Удачи!", saved_name)
        sys.exit()
       
#Это для того чтобы пользователь сам мог добавить свое имя



#Запуск класса и функций
program = program()


actions = {
    "1": lambda: program.new(),
    "1": lambda: program.deadline(),
    "2": lambda: program.delete(),
    "3": lambda: program.view(),
    "4": lambda: program.save(),
    "5": lambda: program.exit()
}

while True:
    print("Программа Напоминания")
    print("=====================")
    program.view()
    print("1 - Создать напоминание")
    print("2 - Удалить напоминание")
    print("3 - Посмотреть напоминания")
    print("4 - Сохранить и выйти")
    print("5 - Выйти без сохранений")

    x = input(">")
    if actions.get(x):
        actions[x]()
    else:
        print("!Нету такого действия!")
        print()
 
Последнее редактирование модератором:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
При вызове метода deadline() переменная self.t не определена. Вам нужно или установить какое-то значение в self.t при инициализации класса (в методе __init__()) или в словаре actions функциям program.new() и program.deadline() выдать разные ключи. А то в данном случае получается что функция program.new() никогда не вызовется.
 
  • Мне нравится
Реакции: Максим Грушин

Максим Грушин

Пользователь
Пользователь
Апр 10, 2020
63
8
8
19
Тюмень
При вызове метода deadline() переменная self.t не определена. Вам нужно или установить какое-то значение в self.t при инициализации класса (в методе __init__()) или в словаре actions функциям program.new() и program.deadline() выдать разные ключи. А то в данном случае получается что функция program.new() никогда не вызовется.
Все исправил, но слушайте, вы знаете почему когда я создаю напоминание в def new()
Не идет сама работа в def deadline() Хотя раньше оно шло, а сейчас почему то нет
И даже ошибок не показывает ни каких.
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Все исправил, но слушайте, вы знаете почему когда я создаю напоминание в def new()
Не идет сама работа в def deadline() Хотя раньше оно шло, а сейчас почему то нет
И даже ошибок не показывает ни каких.
Я же не знаю как вы исправили код. Если у вас остались одинаковые ключи в словаре actions, то работать будет только последний из них и соответственно вызываться только функция с этим ключом.
 
  • Мне нравится
Реакции: Максим Грушин

Максим Грушин

Пользователь
Пользователь
Апр 10, 2020
63
8
8
19
Тюмень
Я же не знаю как вы исправили код. Если у вас остались одинаковые ключи в словаре actions, то работать будет только последний из них и соответственно вызываться только функция с этим ключом.
Нет, я убрал всю эту функцию и оставил только program.new
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Нет, я убрал всю эту функцию и оставил только program.new
Напишите код который есть на данный момент и в чем состоит проблема. А то непонятно - получается вы не вызываете функцию deadline(), но ожидаете что она как-то будет делать что-то.
 

Максим Грушин

Пользователь
Пользователь
Апр 10, 2020
63
8
8
19
Тюмень
Напишите код который есть на данный момент и в чем состоит проблема. А то непонятно - получается вы не вызываете функцию deadline(), но ожидаете что она как-то будет делать что-то.
Код:
import pickle
from datetime import datetime, date, time
import datetime
import time
import sys
import os


saved_name = None
try:
    with open("user.txt", "r", encoding="utf-8") as f:
        saved_name = f.read()
except:
    pass

if saved_name:
    print("Добрый день", saved_name)
else:
    print("Добрый день, как вас зовут?")
    name = input("Введите ваше имя\n|>")
    with open("user.txt", "w", encoding="utf-8") as f:
        f.write(name)

                #Класс для облегчение программы
class program():
    data = {}
    
                #Функции для облегчение строение программы
    def new(self):
        self.clear = lambda: os.system("cls")
        self.clear()

        print("'''Создание напоминание'''")
        print("Как называется напоминание?")
        self.text = input(">")

        with open("self.text.pickle", "wb") as f:
            pickle.dump(self.text, f)

        print("Укажите время и дату")
        
        self.t = input("Вводите время в стиле ЧЧММCС\nВводите дату в стиле ДД/ММ/ГГГГ\n>")
        self.t = datetime.datetime.strptime(self.t, "%H:%M:%S %d/%m/%Y")

        print("Вы указали на:\n>", self.t)
    
    def view(self):
        print("<Список напоминаний>")
        print("====")
        with open("self.text.pickle", "rb") as f:
            self.text_new = pickle.load(f)
        print(self.text_new)
        print("=====================")
    
        
    def deadline(self):
        while True:
            self.now = datetime.datetime.now()
            print("Сейчас время:".format(self.now.strftime("%d/%m/%Y %H:%M:%S")))
            if self.now >= self.t:
                print("Время вышло\n>", self.now)
                break
            time.sleep(1)

                
        
    #def delete(self):
        


    #def save(self):
        #with open("data.pickle", "wb") as f:


    def exit(self):
        print("=====================")
        print("Удачи!", saved_name)
        sys.exit()
        
#Это для того чтобы пользователь сам мог добавить свое имя



#Запуск класса и функций
program = program()


actions = {
    "1": lambda: program.new(),
    "2": lambda: program.delete(),
    "3": lambda: program.view(),
    "4": lambda: program.save(),
    "5": lambda: program.exit()
}

while True:
    print("Программа Напоминания")
    print("=====================")
    program.view()
    print("1 - Создать напоминание")
    print("2 - Удалить напоминание")
    print("3 - Посмотреть напоминания")
    print("4 - Сохранить и выйти")
    print("5 - Выйти без сохранений")

    x = input(">")
    if actions.get(x):
        actions[x]()
    else:
        print("!Нету такого действия!")
        print()

Вот код на данный момент
А ошибка в том, что раньше, program.deadline() работал, тогда когда я создаю новое напоминание.
То есть я создал напоминание и deadline тут же начинал работать, а сейчас почему то он не включается.
Ошибки никакой не выдает, но он опять же почему не включается
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
А ошибка в том, что раньше, program.deadline() работал, тогда когда я создаю новое напоминание.
То есть я создал напоминание и deadline тут же начинал работать, а сейчас почему то он не включается.
Ошибки никакой не выдает, но он опять же почему не включается
Не включается потому что вы его не вызываете. Попробуйте вызвать:
Python:
def new(self):
    self.clear = lambda: os.system("cls")
    self.clear()

    print("'''Создание напоминание'''")
    print("Как называется напоминание?")
    self.text = input(">")

    with open("self.text.pickle", "wb") as f:
        pickle.dump(self.text, f)

    print("Укажите время и дату")
    
    self.t = input("Вводите время в стиле ЧЧММCС\nВводите дату в стиле ДД/ММ/ГГГГ\n>")
    self.t = datetime.datetime.strptime(self.t, "%H:%M:%S %d/%m/%Y")

    print("Вы указали на:\n>", self.t)
    self.deadline()
А также в самом методе deadline чтобы время отображалось замените эту строку:
Python:
print("Сейчас время:".format(self.now.strftime("%d/%m/%Y %H:%M:%S")))
на такую:
Python:
print("Сейчас время: " + self.now.strftime("%d/%m/%Y %H:%M:%S"))
 
  • Мне нравится
Реакции: Максим Грушин

Максим Грушин

Пользователь
Пользователь
Апр 10, 2020
63
8
8
19
Тюмень
Не включается потому что вы его не вызываете. Попробуйте вызвать:
Python:
def new(self):
    self.clear = lambda: os.system("cls")
    self.clear()

    print("'''Создание напоминание'''")
    print("Как называется напоминание?")
    self.text = input(">")

    with open("self.text.pickle", "wb") as f:
        pickle.dump(self.text, f)

    print("Укажите время и дату")
   
    self.t = input("Вводите время в стиле ЧЧММCС\nВводите дату в стиле ДД/ММ/ГГГГ\n>")
    self.t = datetime.datetime.strptime(self.t, "%H:%M:%S %d/%m/%Y")

    print("Вы указали на:\n>", self.t)
    self.deadline()
А также в самом методе deadline чтобы время отображалось замените эту строку:
Python:
print("Сейчас время:".format(self.now.strftime("%d/%m/%Y %H:%M:%S")))
на такую:
Python:
print("Сейчас время: " + self.now.strftime("%d/%m/%Y %H:%M:%S"))
Хорошо спасибо!
 

Форум IT Специалистов