Вообще-то да, эту ошибку тут часто спрашивают, хотя она очень простая.
for row in records:
loginD = row[2]
passwordD = row[3]
d = Dnevnik(login=loginD, password=passwordD)
У тебя d создаётся после цикла, только для последнего значения loginD и passwordD.
Вопрос: что будет, если в records ничего нет?
Тело цикла не выполнится ни разу, переменные loginD и passwordD не будут определены. А ты дальше пытаешься их использовать, о чём питон и предупреждает.
Ну и да, код - какой-то бред.
1. Ты сначала делаешь records = cursor.fetchall(). Тем самым ты
выбираешь все строки, возвращённые последним запросом, выполненным через cursor. При следующем вызове функции homeworkss() cursor уже не будет содержать строк (ты их все выбрал в прошлый раз). А следующий вызов может настать в любой момент, так как homeworkss() - обработчик события. Почему ты выполняешь запрос вне homeworkss()?
2. Зачем вообще перебирать строки таким циклом, который создаёт дневник только для последней строки? Если тебе нужна конкретная строка, то почему не выбрать запросом только её? Если тебе нужны все строки, почему ты создаёшь дневник только для одной?