访问在 for 循环中设置的动态创建的变量

Accessing dynamically created Variables set in a for loop

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

简而言之,我在 wxpython notebook 中动态创建了一堆页面,并且在每个页面上我都放置了更多的小部件和 sizer 等。我的问题是,如果我想在创建页面时访问 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 页的 print(self.label_1) ?

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

希望最终编辑:

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

对,就是这样,将它们作为列表放入字典中,需要时可以拉取列表。

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

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 包含一个对象列表,然后可以使用该列表访问对象的属性。您可以利用这种方法,也可以使用字典结构将对象关联到特定标识符。您需要什么才能最好地服务于您的目的。