【问题标题】:Store class variable in dictionary在字典中存储类变量
【发布时间】:2015-05-31 17:16:08
【问题描述】:

我正在制作一个程序,该程序将有一个接收两个输入的框,一个事件名称和为该事件分配的时间,稍后将输出已添加的所有事件的列表。这是输入框的类:

class agendaEvent:
    def __init__(self, master):
        self.frame = Frame(master, padx=10, pady=10)
        self.frame.grid()
        self.name = Entry(self.frame)
        self.name.grid(row=1, column=0)
        self.time = Entry(self.frame, width=10)
        self.time.grid(row=1, column=1, padx=5)

我对编程很陌生,但我相信存储nametime 的正确方法是在字典中。

可能有多个类的实例同时运行,并且在这些实例已经存储之后可以运行更多。最好将它们全部存储在同一个字典中。

但是,我不知道如何将self 变量存储在以后可以在课堂外访问的字典中。这可能吗?如果是这样,怎么做?如果没有,我如何以可以在单独的函数中访问的方式存储变量?

编辑:这是复制我的问题所需的最少代码(我认为):

from Tkinter import *
from functools import partial


class agendaEvent:

    def __init__(self, master):
        self.frame = Frame(master, padx=10, pady=10)
        self.frame.grid()
        self.name = Entry(self.frame)
        self.name.grid(row=1, column=0)
        self.time = Entry(self.frame, width=10)
        self.time.grid(row=1, column=1, padx=5)
        self.label1 = Label(self.frame, text="Event Name")
        self.label1.grid(row=0, column=0)
        self.label2 = Label(self.frame, text="Minutes")
        self.label2.grid(row=0, column=1)

def addOne(master):
    this_instance = agendaEvent(master)

def addEvent():
    window = Toplevel()
    addOneButton = Button(window, text='+1', command=partial(addOne, window))
    addOneButton.grid(row=0, column=0, pady=5)
    doneButton = Button(window, text='Done', command=partial(done, window))
    doneButton.grid(row=1, column=0, pady=3)

def done(windowInstance):

    #This is where I was thinking
    #the code for storing information
    #should be because it should store
    #when the done button is pressed.
    #This may not be a good way to do it,
    #I don't know. 

    windowInstance.destroy()
    windowInstance = ""



root = Tk()


addEventButton = Button(root, text="Add Events", command=addEvent)
addEventButton.pack()

root.mainloop()

【问题讨论】:

  • @jonrsharpe 姓名和时间。目前阻碍我的是我缺乏知识。我不知道如何制作一个字典来存储所有议程事件实例的名称和时间,然后我可以稍后在脚本中的单独函数中访问它。首先,字典是解决这个问题的正确方法吗?如果是这样,那么具体如何做到这一点?
  • 也许google.com/… 会是开始的地方? ;-)
  • @boardrider 我试图搜索但找不到答案。我的大部分问题我都可以用谷歌解决,但对于那些我无法通过搜索找到的问题,我会来到这里。当我在这里找不到它时,我会发布自己的帖子,希望有人知道如何帮助我。
  • @jonrsharpe 我的最终目标是拥有一个带有主列表的主窗口,并在侧窗口中打开课程议程事件。然后,用户将选择他们希望添加的事件的数量,并为每个事件键入名称和时间。然后他们将单击完成按钮,在主窗口中,主列表将显示他们添加的所有事件。按下完成按钮时,侧窗也会关闭。除了能够将在侧窗口中输入的信息传输到主窗口的主列表之外,我几乎拥有一切。有没有更好的方法来做到这一点?
  • 如果是这样,我很想听听。同样,我是编码新手,我愿意听到任何可以帮助我提高能力并尽可能有效地解决问题的内容。

标签: python class dictionary tkinter


【解决方案1】:

认为您需要做的是将您创建的agendaEvent 实例存储在一个列表中;然后你可以在之后遍历列表:

from Tkinter import *
from functools import partial

events = []  # place to store the instances

class agendaEvent:

    ...


def addOne(master):
    events.append(agendaEvent(master))  # store the new instance in the list

def addEvent():
    ...

def done(windowInstance):
    for event in events:
        ...  # use event.time, event.date, etc.
    windowInstance.destroy()
    windowInstance = ""

root = Tk()

addEventButton = Button(root, text="Add Events", command=addEvent)
addEventButton.pack()

root.mainloop()

如果可以再次调用此部分,您可能还需要清除done中的列表。

【讨论】:

  • 这几乎可以完美运行。我遇到的一个问题是,我稍后在函数 addOne 中将变量 this_instance 用于一些命令,将删除按钮添加到其框架中,并用作删除函数中的参数。我不知道如何调用列表中的特定项目来实现相同的功能。有没有办法做到这一点?感谢您的帮助,如果我的问题很愚蠢,我很抱歉。我只是不太了解编码,因此我尝试学习。
  • @JohnHall 然后离开events.append(this_instance) 直到之后您需要进行任何其他设置,或使用events[-1] 访问您放入列表中的最后一项。
  • for event in events: lbl = Label(root, text=event.name) lbl2 = Label(root, text=event.time)
  • @JohnHall 哦,好,评论中的代码不可读。这是一个问题吗?
  • 并不是要单独发送,这就是我的代码的样子,但是当我显示标签时,它只显示一长串数字,并且 2 是相同的。我不太确定我做错了什么,但我认为我必须应用某种函数来获取我输入的实际数字,我打算先检查标准库,但现在我不小心发送了。
【解决方案2】:

您可以使用类变量来存储实例外部可用的数据。假设您想要存储映射到时间的名称,您可以添加以下内容(假设 Entry 类是可散列的):

class agendaEvent:
    instances = dict()  # Class variable, access with agendaEvent.instances

    def __init__(self, master):
        self.frame = Frame(master, padx=10, pady=10)
        self.frame.grid()
        self.name = Entry(self.frame)
        self.name.grid(row=1, column=0)
        self.time = Entry(self.frame, width=10)
        self.time.grid(row=1, column=1, padx=5)
        self.instances[self.name] = self.time

现在要从其他地方访问这些值,请使用:

 agendaEvent.instances

例如如果您有一个名称条目存储在“名称”中,则检索其时间条目:

time = agendaEvent.instances[name]

【讨论】:

  • Entry 是有效的字典键吗?
  • 是的,它似乎是。刚刚试了一下以确保它是。
【解决方案3】:

如果要将议程事件存储在字典中,则必须先序列化议程事件对象,然后再将其存储为值,并在尝试访问其名称或时间时反序列化对象。

您可以使用诸如 Pickle 之类的库来执行此操作,或者使用 Json 字符串自己执行此操作。

根据您的问题,我不确定这是否是您想要做的。

【讨论】:

  • 我不想存储实际的类实例。我想存储通过类 self.name 和 self.time 中的条目获得的变量。我的问题在于将 self 变量存储在可在任何地方访问的字典中,以及将所有实例存储在同一个字典中。我对如何使用字典知之甚少,我正在努力学习,但我找不到我的问题的答案。
  • 使用 Redis,一个键值缓存和存储,将为您提供一个可以在任何地方访问的字典。将实例作为值存储在 Redis 缓存中将使您能够访问该实例的 self.nameself.time 变量。
  • 实例结束后信息还会保留吗?此外,如果以这种方式存储超过一百个事件实例,是否会导致性能问题?
  • 是的,信息将被保留。这就是使用 Redis 的重点——键值缓存和 store 。至于性能,我仍然不确定您要做什么,也无法给您确切的答案。但是,如果您阅读 Redis,您会发现所有内容都保存在内存中。因此,如果您要存储大量数据,则可能会出现性能问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多