Как создать строки с помощью цикла For

У меня есть список с разными элементами количество которых может изменяться и мне нужно создать под каждый элемент списка своё поле и строку с выпадающим списком. Я делаю это с помощью цикла for но мне так же нужна возможность обратиться к каждому выпадающему списку что бы получить выбранное значение. Сейчас мой код выглядит так:

comp_count = 0
for component in unique_components:
    comp_count = comp_count + 1
    comp = tk.Text(tab3, width=lenght+1, height=1)
    if comp_count % 2 == 0:
        comp = tk.Text(tab3, width=lenght+1, height=1, bg='#d6d4d4')
    comp.insert(1.0, component)
    comp.configure(state=tk.DISABLED)
    comp.grid(row=comp_count, column=0)
    stack_choose = ttk.Combobox(tab3, values='8mm 12mm 16mm 24mm Special', state='readonly')
    stack_choose.grid(row=comp_count, column=2)

А результат вот так:

введите сюда описание изображения

То есть интерфейс выглядит так как мне нужно но я не могу обратиться ни к строчке, ни к выпадающему списку


Ответы (1 шт):

Автор решения: insolor

До цикла создайте пустой список, в цикле добавляете создаваемый контролы как строки в этот список (подсписками/кортежами/namedtuple/свой класс):

components = []
for component in unique_components:
    ...
    components.append([comp, stack_choose])

Дальше обращаетесь к нужному контролу в списке по индексу или в цикле.

Минимальный пример:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

unique_components = ["abc", "def", "ghj"]

tab3 = root

components = []
comp_count = 0
for component in unique_components:
    comp_count = comp_count + 1
    comp = tk.Text(tab3, height=1)
    comp.insert(1.0, component)
    comp.configure(state=tk.DISABLED)
    comp.grid(row=comp_count, column=0)
    stack_choose = ttk.Combobox(tab3, values='8mm 12mm 16mm 24mm Special', state='readonly')
    stack_choose.grid(row=comp_count, column=2)
    components.append([comp, stack_choose])


def print_data():
    for comp, stack_choose in components:
        print(comp.get(1.0, tk.END).rstrip(), stack_choose.get())

tk.Button(root, text="Get data", command=print_data).grid()

root.mainloop()

Скриншот окна и вывода терминала после ввода и нажатия на кнопку:

введите сюда описание изображения

→ Ссылка