首页 > 解决方案 > 在 tkinter.listbox 对象/选项中存储数据的优雅方式

问题描述

我有两个不同的“列表框”对象的实例我将它们中的每一个保存在不同的参考名称中

例子:

l1 = tkinter.Listbox(exampleFrame)
l2 = tkinter.Listbox(exampleFrame)

l1.setvar("check", "1")
l2.setvar("check", "2")

print("var is - " + l1.getvar("check"))

问题是每当我调用 l1 的 getvar 时,输出将是 l2 的 var

output:
var is - 2

我可以从这个结果中假设 Listbox setvar/getvar 函数是所有 Listbox 对象的静态方法?

如果是这样,是否有任何选项可以使用内置函数为每个 Listbox 对象存储数据?

我的目标是能够为每个列表框选项存储一个 id,例如:

    Listbox1:
        Albert
        Michel
        Drake

将每个用户选项的 id 存储在 var 中。所以当我调用插入方法时,我将 user.id 存储在 setvar 中的每个索引

l1.insert(index, user.name)
l1.setvar("var_"+index, user.id)

所以当我调用 getvar("var_"+index) 时,我会得到所选用户的 ID

只有当我的整个项目中有一个列表框时,当前的解决方案才会有效。

为多个列表框对象存储数据的任何好的解决方案?

- 编辑 -

我试图实现的是在 Listbox 选项中存储更多值的选项

例子:

    l1 = Listbox(frame)
    l1.insert(0, 'Drake')
    l1.insert(1, 'Jacob')

因此,在列表框中,我将拥有更多存储的每个选项的数据,而不是只有索引和字符串。

@1966bc 建议创建一个字典并使用选项索引作为键,所以如果我想为 Drake 存储更多数据,我可以执行以下操作:

l1.anydictname = {}
l1.anydictname[0] = {'Name' : 'Drake', 'data' : 'moredata'}

所以现在我可以检查 Drake 的数据我可以使用 Drake 列表索引并将数据指向为 l1.anydictname[index].data 或名称或我存储在其中的任何数据。

谢谢,像魔术一样工作。如果有人有更清洁的方法,您可能会建议

标签: pythontkinter

解决方案


如果我理解正确,要执行您想要的操作,您必须将列表框索引与字典相关联。

我附上了一个工作示例当您选择一行列表框时,您会得到如下内容

on_listbox_select: index = 2, pk = 3 values = Drake

其中 index 是列表框索引,pk 是所选记录的 id。

在示例中,我使用由主键、名称和字段组成的虚构记录集填充列表框以增强其状态

rs = [(1,"Albert",1), (2,"Michel",1), (3,"Drake",0), (4,"Alan",1),(5,"George", 0)]

#!/usr/bin/python3
import sys
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox


class App(tk.Tk):
    """Application start here"""
    def __init__(self):
        super().__init__()

        self.protocol("WM_DELETE_WINDOW", self.on_close)
        self.title("Simple App")
        self.init_ui()
        self.set_values()

    def init_ui(self):
        
        w = ttk.Frame(self, padding=8)
       
        r = 0
        c = 1
        self.lstItems = tk.Listbox(w)
        self.lstItems.bind("<<ListboxSelect>>", self.on_listbox_select)
        self.lstItems.grid(row=r, column=c, padx=5, pady=5)
        
        w.grid(row=0, column=0, sticky=tk.N+tk.W+tk.S+tk.E)

    def set_values(self):

        self.lstItems.delete(0, tk.END)
        index = 0
        self.dict_items = {}

        #simulate a recordset the fields are: pk, name, enable,
        #if enable == 0 paint line gray
        rs = [(1,"Albert",1),
              (2,"Michel",1),
              (3,"Drake",0),
              (4,"Alan",1),
              (5,"George",0)]

        if rs:
            for i in rs:
                s = "{:}".format(i[1])
                self.lstItems.insert(tk.END, s)
                if i[2] != 1:
                    self.lstItems.itemconfig(index, {"bg":"light gray"})
                self.dict_items[index] = i[0]
                index += 1
                          
  
    def on_listbox_select(self, evt=None):

        if self.lstItems.curselection():

            index = self.lstItems.curselection()[0]
            pk = self.dict_items.get(index)
            s = self.lstItems.get(index)
            
            print("on_listbox_select: index = {0}, pk = {1} values = {2}".format(index, pk, s))
           
    def on_close(self,evt=None):
        """Close all"""
        if messagebox.askokcancel(self.title(), "Do you want to quit?", parent=self):
            self.destroy()

def main():

    app = App()
    app.mainloop()

if __name__ == '__main__':
    main()            
    

在此处输入图像描述


推荐阅读