Существует замечательный пакет под названием shared_preferences , разработанный командой Flutter, который обрабатывает это на iOS и Android без необходимости касаться базы собственного кода!
Я не могу сказать, если вы Вы используете его из своего кода, но если нет, я настоятельно рекомендую проверить его.
В первую очередь, Ваша проблема не имеет никакого отношения к Tkinter; лучше при сокращении его вниз до простой части кода, демонстрирующего проблему таким образом, можно экспериментировать с ним более легко. Вот упрощенная версия того, что Вы делаете это, я экспериментировал с. Я заменяю dict вместо меню, чтобы помочь записать небольшой тестовый сценарий.
items = ["stack", "over", "flow"]
map = { }
for item in items:
def new_command():
print(item)
map[item] = new_command
map["stack"]()
map["over"]()
map["flow"]()
Теперь, когда мы выполняем это, как Вы сказали, мы добираемся:
flow
flow
flow
Проблемой здесь является понятие Python объема. В частности, for
оператор не представляет новый уровень объема, ни новую привязку для item
; таким образом, это обновляет то же item
переменная каждый раз через цикл и весь из new_command()
функции относятся к тому же самому объекту.
То, что необходимо сделать, представляют новый уровень объема, с новой привязкой, для каждого из item
s. Самый легкий способ сделать, который должен перенести его в новое функциональное определение:
for item in items:
def item_command(name):
def new_command():
print(name)
return new_command
map[item] = item_command(item)
Теперь при замене этим в предыдущую программу Вы получаете желаемый результат:
stack
over
flow
Такой вещью является настоящая типичная проблема в Tkinter, я думаю.
Попробуйте это (в соответствующей точке):
def new_command(tag=tag):
self.add_tag(tag)