【问题标题】:Displaying objects in a tkinter Listbox在 tkinter 列表框中显示对象
【发布时间】:2019-11-09 14:47:08
【问题描述】:
我了解到您可以将对象放入 tkinter 列表框。
我想知道的是如何在 Listbox 中以有意义的名称显示它们。目前我有一个类'Character',我在列表框中得到的只是<Character.Character object at 0x002CF6D0>。如果我检索它,我就会把那个对象拿回来,这就是我想要的。
但是列表框中的那个项目对用户来说不是很有用。有没有办法可以给它一个我选择的名称,同时仍然能够检索对象?
【问题讨论】:
标签:
python-3.x
tkinter
listbox
【解决方案1】:
您不能将对象放入列表框中。列表框对 python 对象一无所知,只能显示字符串。如果您尝试将对象插入列表框中,tkinter 会将该对象转换为字符串,然后将字符串(并且仅字符串)存储在列表框中。稍后您将无法检索实际对象。
但是,如果您希望它自动将您的对象转换为具有您选择的名称的字符串,您可以覆盖您的类的 __str__ 方法。该函数是 tkinter 用来在将对象插入到小部件之前将其转换为字符串的函数。
例如,下面是一个类定义,当对象转换为字符串时将返回 name 属性:
class Character():
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
这是在 tkinter 程序中使用该类的示例。
import tkinter as tk
root = tk.Tk()
listbox = tk.Listbox(root)
listbox.pack(fill="both", expand=True, padx=2, pady=2)
c1 = Character("Inigo Montoya")
c2 = Character("Fezzik")
listbox.insert("end", c1)
listbox.insert("end", c2)
root.mainloop()