python - 在 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 或名称或我存储在其中的任何数据。
谢谢,像魔术一样工作。如果有人有更清洁的方法,您可能会建议
解决方案
如果我理解正确,要执行您想要的操作,您必须将列表框索引与字典相关联。
我附上了一个工作示例当您选择一行列表框时,您会得到如下内容
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()
推荐阅读
- vba - 如何使用 VBA 从单击的文本框中获取文本?
- vba - Excel中的工作表大小和内存使用情况
- angular - Angular 指令选择器不适用于外部库中的元素
- javascript - 如何检查电子邮件是否有效
- unit-testing - 通过模拟 getter 测试类
- github - 为什么我需要根据许可证提交补丁?
- javascript - 如何通过单击链接或 url 根据请求参数中的值更改页面内容?
- azure-functions - 如何配置 Azure Functions 以连接到 NSG 后面的 VM
- python-3.x - 如何从与字符串的另一端匹配的字符串末尾删除/删除字符
- java - Android - 使用 WeakReference 将数据保存在内存中