【问题标题】:Accessing dynamically created Variables set in a for loop访问在 for 循环中设置的动态创建的变量
【发布时间】:2020-12-16 00:26:07
【问题描述】:

TLDR FIX:将您的对象(或对象列表)放入字典中

简单地说,我在 wxpython 笔记本中动态地创建了一堆页面,并且在每个页面上我都放置了更多的小部件和大小调整器等。我的问题是,如果我想在创建页面时访问 for 循环中设置的变量,我无法访问,因为一旦 for 循环再次运行,该变量将被重置并用于填充新页面。

类似的东西

class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
    kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
    wx.Frame.__init__(self, *args, **kwds)
    self.SetSize((400, 300))
    self.notebook_1 = wx.Notebook(self, wx.ID_ANY)
    self.text_button = wx.Button(self, wx.ID_ANY, "get text")
    self.Bind(wx.EVT_BUTTON, self.get_text_handler, self.text_button)

    self.__set_properties()

    sizer_1 = wx.BoxSizer(wx.VERTICAL)
    sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
    sizer_1.Add(self.text_button, 0, 0, 0)
    sizer_1.Add(self.notebook_1, 1, wx.EXPAND, 0)
    self.SetSizer(sizer_1)
    self.Layout()
    numlist = (1, 2, 3, 4)
    #global page_dictionary
    #page_dictionary = {}
    for i in numlist:
        self.notebook_1_pane_2 = wx.Panel(self.notebook_1, wx.ID_ANY)
        self.notebook_1_pane_2.SetSizer(sizer_2)
        self.notebook_1.AddPage(self.notebook_1_pane_2, str(i))
        self.label_1 = wx.TextCtrl(self.notebook_1_pane_2, wx.ID_ANY, str(i))
        sizer_2.Add(self.label_1, 0, 0, 0)
        self.Layout()
        #page_k = self.label_1.GetValue()
        #page_k_good = page_k + str(i)
        #page_dictionary[page_k_good] = i
        #print(page_dictionary)

def __set_properties(self):
    self.SetTitle("frame")

def get_text_handler(self, event):  # wxGlade: MyFrame.<event_handler>
    print(self.label_1.GetValue())

这与我实际运行的唯一区别是 numlist 变量实际上是动态生成随机数量的值

我的问题是,如果我想引用我在前几页中设置的任何标签,我不能因为 self.label_1 变量被重置为最后一页上的条目。所以如果我想访问第 1 页上的标签,标签变量设置为在 for 循环中创建的最后一页的值。就像一旦标签被放置并填充到 wxNotebook 页面上,它就消失了,并且该小部件中的内容不再可访问。

那么,例如,当 self.label_1 被重写以匹配生成的最后一页中的标签时,我将如何在笔记本中的第 1 页打印(self.label_1)?

在搞乱字典,所以我把它注释掉了。 我如何能够单击该按钮,并让它从当前页面的框中获取文本?

希望最终编辑:

我将如何将多个对象分配到字典中?我是否需要将值 i 分配为列表 (label_1, Label_2) 然后当需要调用它们的方法时只需从列表中引用它们,即现在在字典中?

是的,做到了,将它们作为列表放入字典中,需要时可以拉出列表。

【问题讨论】:

  • 根据我认为您所说的您正在使用 for 循环在笔记本中动态创建一系列页面。在每个页面上,您都放置了许多小部件。您的问题是,在完成特定页面的循环后,您无法再引用该页面的内容,因为 number 现在引用了不同的页面。请编辑您的问题以显示最小的可重复集。请参阅Minimal Reproducible Example,了解如何最好地帮助我们。
  • 这是我第一次搞砸这样的事情,我什至不知道如何开始去做。有没有办法在生成时将变量 i 添加到变量名中?所以 self.label_1 将成为 self.label_1(i) 并最终成为 self.label_11、self.label_12、self.label13 等,这样我可以在生成后轻松引用它们?

标签: python-3.x dynamic wxpython


【解决方案1】:

我仍然不知道您到底要做什么,但是根据有根据的猜测,我认为您正在尝试保留在循环中创建的对象的身份,以便可以在循环之外访问它们。考虑到这一点,这里有一个如何做到这一点的例子。这是一个非常简单的例子:

import random as rnd  #used to create a random number for each object

# just a list of names to be scanned in for loop
lst = ["a", "b", "c", "d"]

# Just an illustrative object for demo purposes
class SillyClass:
    def __init__(self, name, nmb):
        self._id = name
        self._nmb = nmb
        
    @property
    def name(self):
        return self._id
    
    @property
    def number(self):
        return self._nmb
      
# create a list of objects for later reference
def build_objects(lst):
    rslt = []
    for itm in lst:
        rslt.append(SillyClass(itm, rnd.randrange(5, 200)))
    return rslt  

# show use of list to print object data
obj_lst = build_objects(lst)

# Show the contents of obj_lst
print(obj_lst, "\n")

# show access of object attributes
for obj in obj_lst:
    print(f"Object: {obj.name} contains {obj.number}")  

运行这段代码的结果是:

[<__main__.SillyClass object at 0x0000022C5CB9E9D0>, <__main__.SillyClass object at 0x0000022C5CB9EFD0>, <__main__.SillyClass object at 0x0000022C5CB9E670>, <__main__.SillyClass object at 0x0000022C5CC42370>] 

Object: a contains 187
Object: b contains 164
Object: c contains 97
Object: d contains 52  

这说明 obj_lst 包含一个对象列表,然后可用于访问对象的属性。您可以利用这种方法,或者可能使用 dict 结构将对象与特定标识符相关联。您需要什么才能最好地服务于您的目的。

【讨论】:

  • 基本上我在 wxpython 中为笔记本的每一页分配一个 textctrl,但我无法返回当前在这些 textctrls 中的内容,因为每次循环重复时它们分配给的变量都会被替换。是否可以与动态创建的笔记本页面上的小部件进行交互,或者这只是一个疯狂的概念
  • 我已经用我所说的 textctrls 更新了代码
  • 如果要访问小部件,请创建一个字典,其中键是变量名或整数,值是创建的小部件对象。示例:{1:widget_object1, 2:widget_object2, . . . .}
  • 在您的循环中,将page_dictionary[page_k_good] = i 替换为page_dictionary[i] = self.label_1 现在page_dictionary 包含每个已定义的self_label_1 按页面索引进行索引。
  • 甜蜜,我的最后一个问题是我将如何访问这些对象以获取信息,你可以调用字典中对象的方法吗?
猜你喜欢
  • 2019-06-14
  • 1970-01-01
  • 2021-04-06
  • 2021-03-04
  • 2014-05-20
  • 2015-09-10
  • 2019-02-09
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多