Убрать кнопку сохранить в файл, заменить ее на кнопку добавить, которая будет добавлять нового студента, которого можно будет отредактировать. Как-то так:

Убрать кнопку сохранить в файл, заменить ее на кнопку добавить, которая будет добавлять нового студента, которого можно будет отредактировать. Как-то так:

Теперь попробуем реализовать возможность править данные на форме.
Ну то есть, например, беру я студента и меняю ему фамилию.
Сначала сделаем кнопочку, для сохранения изменений:
class UI():
def __init__(self, gui):
#...
# это наша старая кнопка, ее не трогаем
self.button = Button(text="Сохранить в файл", command=self.save_to_file)
self.button.place(x=10, y=130)
# а вот тут добавил новую кнопку, привязал к ней функцию
self.button = Button(text="Обновить", command=self.on_student_update_click)
self.button.place(x=130, y=130)
# ...
# ну и саму функцию добавил
def on_student_update_click(self):
print("Обновляю")
# ...
о как получится должно

Теперь попробуем описать поведение которое нам надо реализовать
Ну шо, ноги в руки и пишем:
class UI():
def __init__(self, gui):
# ...
def on_student_update_click(self):
item_index = self.studentsList.curselection()[0] # получаем номер выделенной записи в списке на форме
item = self.students[item_index] # по номеру вытаскиваем словарик соответствующий студенту на форме
item['name'] = self.name.get() # перезаполняем значения словарика
item['last_name'] = self.last_name.get() # перезаполняем значения словарика
item['group'] = self.group.get() # перезаполняем значения словарика
item['patronymic'] = self.patronymic.get() # перезаполняем значения словарика
тестируем:

хм, что-та не работает…
А! Точно, у нас ведь список на форме напрямую не привязан к данным students, поэтому, чтобы форма обновилась надо перезаполнить этот список с нуля. То есть сначала все выкинуть, а потом заполнить.
class UI():
def __init__(self, gui):
# ...
def on_student_update_click(self):
item_index = self.studentsList.curselection()[0]
item = self.students[item_index]
item['name'] = self.name.get()
item['last_name'] = self.last_name.get()
item['group'] = self.group.get()
item['patronymic'] = self.patronymic.get()
# очищаем список
self.studentsList.delete(0, END)
# и перезаполняем
for s in self.students:
self.studentsList.insert(END, f"{s['last_name']} {s['name']}")
пробуем:

о уже ничего-так, только почему-то обновляется всего один раз, а при попытке последовательно обновить и фамилию и имя падает ошибка.
Тут дело в том, что после того как мы удалили список у него слетает выбранный элемент. По идее после каждого клика на кнопку «обновить» надо тыкать еще и на запись в списке.
Но это не удобно, поэтому надо после перезаполнения списка восстанавливать выбранный элемент. Для этого достаточно добавить одну строчку:
class UI():
def __init__(self, gui):
# ...
def on_student_update_click(self):
item_index = self.studentsList.curselection()[0]
item = self.students[item_index]
item['name'] = self.name.get()
item['last_name'] = self.last_name.get()
item['group'] = self.group.get()
item['patronymic'] = self.patronymic.get()
self.studentsList.delete(0, END)
for s in self.students:
self.studentsList.insert(END, f"{s['last_name']} {s['name']}")
# восстанавливаем выделение строки, которую изменяли
self.studentsList.selection_set(item_index)
проверка:

Ну и напоследок давайте поменяем поведение кнопки сохранить в файл чтобы она сохраняла в файл наш именные список, а то получается мы сейчас данные поменяли, но при следующем запуске они слетят.
Сделаем чтобы она просто сохраняла данные в файл:
class UI():
def __init__(self, gui):
# ...
def on_student_update_click(self):
# ...
def on_student_list_click(self, event):
# ...
def save_to_file(self):
# просто перезаписываем файл
with open("user.json", "w", encoding="utf8") as f:
json.dump(self.students, f, ensure_ascii=False, indent=2)
теперь получается изменяя запись чтобы обновления сохранились в файл надо по идее нажать кнопку сохранить в файл.

Вообще, если так подумать, то какой смысл тыкать две кнопки при попытке обновить запись. Можно просто сделать так чтобы при клике на обновить происходило обновление файла
Для этого можно конечно скопипастить код и save_to_file, но проще просто вызывать эту функцию изнутри on_student_list_click, делается это так:
class UI():
def __init__(self, gui):
# ...
def on_student_update_click(self):
# ...
def on_student_list_click(self, event):
item_index = self.studentsList.curselection()[0]
item = self.students[item_index]
item['name'] = self.name.get()
item['last_name'] = self.last_name.get()
item['group'] = self.group.get()
item['patronymic'] = self.patronymic.get()
self.studentsList.delete(0, END)
for s in self.students:
self.studentsList.insert(END, f"{s['last_name']} {s['name']}")
self.studentsList.selection_set(item_index)
# добавили вызов функции сохранения в файл
self.save_to_file()
def save_to_file(self):
# ...
проверка:

Красота! =)