在 tkinter 列表框中显示对象

Displaying objects in a tkinter Listbox

我了解到您可以将对象放入 tkinter 列表框中。

我想知道的是如何以有意义的名称在列表框中显示它们。目前我有一个 class 'Character',我在列表框中得到的只是 <Character.Character object at 0x002CF6D0>。如果我取回它,我会把那个对象取回来,这就是我想要的。

但是列表框中的那个项目对用户不是很有用。有没有一种方法可以给它一个我选择的名称,同时仍然能够检索对象?

您不能将对象放入列表框中。列表框对 python 对象一无所知,只能显示字符串。如果你试图将一个对象插入到列表框中,tkinter 会将该对象转换为字符串,然后将字符串(且仅是字符串)存储在列表框中。您以后将无法检索到实际对象。

但是,如果您希望它自动将您的对象转换为具有您选择的名称的字符串,您可以覆盖 class 的 __str__ 方法。该函数是 tkinter 在将对象插入小部件之前用来将对象转换为字符串的函数。

例如,这里有一个 class 定义,当对象被转换为字符串时 return name 属性:

class Character():
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name

这是在 tkinter 程序中使用 class 的示例。

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()