首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用列表中的名称创建可变数量的条目小部件

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

Stack Overflow用户
提问于 2022-04-06 10:48:53
回答 1查看 51关注 0票数 0

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

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

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

这是我到目前为止所拥有的。

代码语言:javascript
复制
    #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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-06 11:24:02

我不确定我是否理解问题,但也许你应该用字典和嵌套列表代替列表

代码语言:javascript
复制
all_labels  = { e.get(): [] }  # list inside dictionary
all_entries = { e.get(): [] }  # list inside dictionary

以及稍后附加小部件

代码语言:javascript
复制
all_labels[e.get()].append(label)
all_entries[e.get()].append(entry)

稍后,您可以使用for循环和e.get()获取所有值。

代码语言:javascript
复制
for entry in all_entries[e.get()]:
    print(entry.get())

最终,您可以使用嵌套字典。

代码语言:javascript
复制
all_labels  = { e.get(): {} }  # dictionary inside dictionary
all_entries = { e.get(): {} }  # dictionary inside dictionary

以及稍后附加小部件

代码语言:javascript
复制
all_labels[e.get()][size] = label
all_entries[e.get()][size] = entry

稍后,您可以使用for循环、e.get().items()获得所有值。

代码语言:javascript
复制
for size, entry in all_entries[e.get()].items():
    print(size, entry.get())

最小的示例与其他更改,以使代码更具可读性。

因为单词entryentrieslabellabelssizesizes非常相似(而且会产生问题),所以我使用了前缀`all_。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71765400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档