По итогам ряда экспериментов у меня получилось следующее...
Когда ты ставишь ссылку на переменную Tk (например, экземпляр StringVar) для элемента управления, элемент запоминает
внутреннее имя этой переменной (если ты его не задал явно, оно будет иметь вид PY_VAR*), а не хранит ссылку на сам экземпляр класса StringVar. Поэтому переменная умирает, когда значение питоновской переменной value перезаписывается на следующей итерации, что ломает логику работы.
Ты должен сам хранить ссылки на все StringVar на всё время жизни твоего окна. Например, так:
variables = {}
def s():
unique_types = ['1', '2', '3', '4', '5']
entry = {}
label = {}
combo_list = []
types = ['Соответсвия нет', 'A', 'B', 'C']
for row, name in enumerate(unique_types, 0):
value = StringVar()
variables[name] = value
lb = ttk.Label(root, text=name)
lb.grid(row=row, column=0)
label[name] = lb
combobox = ttk.Combobox(root, textvariable=value, values=types, width=90, state="readonly")
combobox.current(0)
combobox.grid(row=row, column=2, padx=10, pady=5)
combo_list.append(combobox)
entry[name] = combobox
b = ttk.Button(root, text="Print all", command=lambda: print_all_entries(unique_types, entry, label))
b.grid(row=row + 1, column=2, padx=10, pady=5)
Одна из причин, почему я обычно советую описывать окно как класс-наследник tkinter.Frame. В конструкторе создаёшь переменные, сохраняешь в поля класса, и они лежат себе. Когда экземпляр класса умрёт, они тоже уничтожатся.
А потом этот экземпляр пакуешь уже в окно верхнего уровня.