将字符串转换为对象名称

时间:2015-08-21 22:58:36

标签: python pyqt

我尝试做这样的事情。

list = []

for i in range(100):
    list.append("self.label_"+ i)
for i in list:
      convetToObject(i)    
      i.setText("Hello")

想法?

3 个答案:

答案 0 :(得分:1)

创建一堆带编号的字符串变量并尝试将它们转换为对象的引用是一种非常非常需要的反模式(参见XY Problem)。这是一个更好的方法:

self.labels = []

for i in range(100):
    l = Label()
    l.setText('Hello')
    self.labels.append(l)

N.B。:我没有PyQT的经验,因此实施细节可能会有所不同。但是,这几乎肯定是您正在寻找的设计模式。

答案 1 :(得分:0)

假设您正在使用以self开头的一系列属性的'label_'实例中工​​作,那么您应该可以执行以下操作:

labels = [getattr(self, k) for k in dir(self) if k.startswith('label_')]
for l in labels:
    l.setText('Hello')

答案 2 :(得分:0)

在python 3中,您可以使用内置函数exec()来执行包含python-code的字符串,在python 2.7中我认为exec语句也可以这样做。 这是python 3中的一个例子,pyqt5:

for i in range(25):
    n = i + 1
    on = 'label_{}'.format(n)               # the name of the object
    src = 'self.{} = QtWidgets.Qlabel()'.format(on) # string to create the object

    exec(src)                           # execute the code

在此循环中设置Text

    src = 'self.{}.setText("{}")'.format(on,n)
    exec(src)

或设置一个对象名以便以后访问该对象:

    src = 'self.{0}.setObjectName("{0}")'.format(on)
    exec(src)

我将对象添加到QVBoxLayout,否则你必须在创建对象的字符串中设置父对象

    src = 'self.layout.addWidget(self.{})'.format(on)
    exec(src)

以后设置文字的示例:

for i in range(25):
    n = i + 1
    on = 'label_{}'.format(n)          
    label = self.findChild(QtWidgets.QLabel,on)
    label.setText(str(n))