使用列表中的名称创建可变数量的条目小部件

Create variable number of Entry widgets with names from list

我有一个 tkinter window,它正在根据数据库查询生成的列表创建标签和条目小部件。

我需要使用在条目小部件中输入的值来创建一个新列表以放入另一个数据库。

数据库中的列表有一个变量计数。 我使用循环来创建标签和条目小部件,但无法弄清楚如何命名条目小部件以便能够将条目放入可用列表中。理想情况下,它将包含来自原始查询的 e.get 和与每个条目相关联的列表。

这是我目前所知道的。

    #Create frame for Size inputs and labels
        sizes_frame = tk.Frame(p,bg='yellow')
        sizes_frame.grid(row=2,column=1)
        connection = sqlite3.connect('productdata.db')
        pro = connection.cursor()
        pro.execute("SELECT Size FROM Products WHERE ColourCode = ?", (e.get(),))
        connection.commit()
        Sizes = pro.fetchall()
            
        keys = Sizes
        otherkeys = Sizes
        count = 0
        othercount = 0
        labels=[]
        otherlabels=[]
    
        for j,l in enumerate(labels):
            l.config(text=str(keys[j])+str(j))
        for key in keys:
            
            labels.append(Label(sizes_frame,text=key,font=('Helvatical bold',10)))
            if count <10:
                labels[count].grid(row = count, column = 1, padx=5, pady= 5)
                count+=1
            else:
                labels[count].grid(row = count-10, column = 3, padx=5, pady= 5)
                count += 1
    
        for j,l in enumerate(otherlabels):
            l.config(text=str(otherkeys[j])+str(j)) 
        for otherkey in otherkeys:
            otherlabels.append(Entry(sizes_frame,width= 6))
            if othercount<10:
                otherlabels[othercount].grid(row = othercount, column = 2, padx=5, pady= 5)
                othercount += 1
            else:
                otherlabels[othercount].grid(row = othercount-10, column = 4, padx=5, pady= 5)
                othercount += 1

我不确定我是否理解问题,但也许你应该使用带有嵌套列表的字典而不是列表

all_labels  = { e.get(): [] }  # list inside dictionary
all_entries = { e.get(): [] }  # list inside dictionary

及以后追加小部件

all_labels[e.get()].append(label)
all_entries[e.get()].append(entry)

稍后您可以使用 for 循环和 e.get()

获取所有值
for entry in all_entries[e.get()]:
    print(entry.get())

最终你可以使用嵌套字典

all_labels  = { e.get(): {} }  # dictionary inside dictionary
all_entries = { e.get(): {} }  # dictionary inside dictionary

及以后追加小部件

all_labels[e.get()][size] = label
all_entries[e.get()][size] = entry

稍后您可以使用 for 循环和 e.get().items()

获取所有值
for size, entry in all_entries[e.get()].items():
    print(size, entry.get())

最简单的示例,并进行了其他更改以使代码更具可读性。

因为单词entryentrieslabellabelssizesizes非常相似(而且它可以使问题)所以我使用前缀`all_

sizes_frame = tk.Frame(p, bg='yellow')
sizes_frame.grid(row=2, column=1)

connection = sqlite3.connect('productdata.db')
pro = connection.cursor()
pro.execute("SELECT Size FROM Products WHERE ColourCode = ?", (e.get(),))
connection.commit()

all_sizes = pro.fetchall()
    
all_labels  = { e.get(): {} }
all_entries = { e.get(): {} }

for number, size in enumerate(all_sizes):
    label = tk.Label(sizes_frame, text=size, font=('Helvatical bold',10))
    entry = tk.Entry(sizes_frame, width=6)
    
    if number < 10:
        label.grid(row=number, column=1, padx=5, pady=5)
        entry.grid(row=number, column=2, padx=5, pady=5)
    else:
        label.grid(row=number-10, column=3, padx=5, pady=5)
        entry.grid(row=number-10, column=4, padx=5, pady=5)
        
    all_labels[e.get()][size] = label)
    all_entries[e.get()][size] = entry


# --- in some function ---

for size, entry in all_entries[e.get()].items():
    print(size, entry.get())
    # ... add `size` and `entry.get()` to database