Проблема заключается в том, что функции находятся на одном уровне видимости. Следовательно, функция update ничего не знает о переменных функции new, так как эти переменные являются локальными и видимыми только внутри функции new. Решение этой проблемы можно представить в виде четырех альтернативных вариантов:
1. Явно передать ссылки на поля ввода с использованием анонимной функции lambda
but.bind("<Button-1>", lambda x: update_user(i, f, l))
При этом не забыть изменить функцию-приемник
def update_user(i, f, l):
2. Вложить функцию update в функцию new
def new(ev):
def update_user(ev):
"Тело функции update"
"Тело функции new"
В этом случае будет выполнено правило LEGB и функция new станет для функции update - объемлюющей.
3. Использовать инструкцию global (Самый плохой вариант. Просто мега плох. Я настоятельно не рекомендую его использовать).
def new(ev):
global i
global f
global l
Последний вариант переводит переменные i, f, l в глобальное пространство имен модуля. Это не есть хорошо, но как вариант, я не могу о нем не сказать…
4. Написать класс. Но это пока для Вас сложновато.