Дело не в tkinter. Причина в том, что когда lambda определяется внутри цикла, ей нужно обязательно явно передавать переменную цикла. Иначе в каждой lambda окажется значение переменной в последней итерации. Напишите так и все заработает:
ttk.Button(root,
text=buttons[id],
command=lambda id=id: display.insert(0, buttons[id])).grid(row=row_position[id],
column=column_position[id])