Я полагаю, что проблема с command=print(self.loadeddata.get("profilename"))
аналогична проблеме с лямбда-выражениями (при этом я удивлен, что ваши кнопки работают вообще. Они должны печатать один раз на init
, а затем никогда не работать, потому что вы вызываете print насоздание кнопки вместо сохранения ссылки на печать).
Из-за особенностей работы лямбды здесь в цикле, подобном этому, в итоге вы печатаете только последнее значение в цикле для всех команд.Вместо этого вам нужно использовать лямбда-оператор, а также определить значение в лямбда-выражении для каждого цикла, чтобы точно записать правильные данные для оператора печати. \
Для этого я создал 3 тестовых файла:
test.json
:
{"profilename":"test", "profilecolor": "green"}
test2.json
:
{"profilename":"test2", "profilecolor": "blue"}
test3.json
:
{"profilename":"test3", "profilecolor": "orange"}
Пример кода:
import tkinter as tk
import json
class Window(tk.Tk):
def __init__(self):
super().__init__()
self.btn_list = []
for file in ['test.json', 'test2.json', 'test3.json']:
with open(file, 'r') as f:
self.btn_list.append(json.load(f))
self.create_tags()
def create_tags(self):
for item in self.btn_list:
tk.Button(self, text=item.get("profilename"), background=item.get("profilecolor"),
command=lambda x=item.get("profilename"): print(x)).pack(side="top", fill="x")
if __name__ == '__main__':
Window().mainloop()
Результаты:
