Функция сбрасывающая значения запоминает прошлое значение и суммирует с новым (Python, tkinter)

Рейтинг: 1Ответов: 1Опубликовано: 13.02.2023

Я по существу. Только начал учить Python и делать мини-проект с tkinter. Столкнулся с проблемой.

Есть Label который отображает баланс. Есть две функции: одна сбрасывает баланс до нуля, другая добавляет к балансу новую сумму. Собственно код:

sum_month = 0

def clear_b():
    result = askyesno(title='Выполнение команды', message='Подтвердить очистку данных?')
    if result:
        sum_month = 0
        label_b_month.config(text=f'{sum_month}')
        showwarning('Выполнение', 'Баланс очищен')
    else:
        showwarning('Выполнение', 'Операция отменена')

def increase_sum_month():
    global sum_month
    result = askyesno(title='Выполнение команды', message='Подтвердить внесение данных?')
    if result: 
        sum_month += int(entry.get())
        label_b_month.config(text=f'{sum_month}')
        showwarning('Выполнение', 'Баланс увеличен')
    else:
        showwarning('Выполнение', 'Операция отменена')

Ситуация в следующем: значение до 0 первая функция сбрасывает. Проблем никаких. А вот если пользователь введёт число через кнопку - то баланс будет отображать это число, но если ПОСЛЕ этого снова очистить баланс первой функцией и добавить НОВОЕ число, то оно каким-то образом складывается с ПРОШЛЫМ, которое вводил пользователь. Почему? Скажите, я не понимаю логики - ведь меня учили, что знак '=' присваивает новое значение переменной. Я ей присвоил 0, как она запоминает то...

Ответы

▲ 1Принят

Очистка никак не привязана к глобальной переменной, то есть ты не очищаешь глобальную переменную и получается что она сохраняет результат. Смотри как должно это работать на небольшом примере:

counter = 0

def clear_counter():
    global counter
    counter = 0

def increase_counter():
    global counter
    counter += int(input())

Касательно твоей задачи это выглядит следующим образом:

sum_month = 0

def clear_b():
    global sum_month
    result = askyesno(title='Выполнение команды', message='Подтвердить очистку данных?')
    if result:
        sum_month = 0
        label_b_month.config(text=f'{sum_month}')
        showwarning('Выполнение', 'Баланс очищен')
    else:
        showwarning('Выполнение', 'Операция отменена')


def increase_sum_month():
    global sum_month
    result = askyesno(title='Выполнение команды', message='Подтвердить внесение данных?')
    if result:
        sum_month += int(entry.get())
        label_b_month.config(text=f'{sum_month}')
        showwarning('Выполнение', 'Баланс увеличен')
    else:
        showwarning('Выполнение', 'Операция отменена')