views:

40

answers:

2

I have code that looks something like this:

self.ui.foo.setEnabled(False)
self.ui.bar.setEnabled(False)
self.ui.item.setEnabled(False)
self.ui.item2.setEnabled(False)
self.ui.item3.setEnabled(False)

And I would like to turn it into something like this:

items = [foo,bar,item,item2,item3]
for elm in items:
    self.ui.elm.setEnabled(False)

But obviously just having the variables in the list with out the 'self.ui' part is invalid, and I would rather not type out 'self.ui' for every element in the list, because that really isn't to much better. How could I rewrite my first code to make it something like what I'm talking about?

+4  A: 

Grab the object to have the function called on it by its attribute name using the built-in getattr function:

items = ['foo', 'bar', 'item', 'item2', 'item3']
for elm in items:
    getattr(self.ui, elm).setEnabled(False)
insin
A: 

You could try something like:

items = [foo,bar,item,item2,item3]
ui = self.ui
for elm in items:
    ui.elm.setEnabled(False)
kchau
Okay, for my own learning, what's wrong with doing this?
kchau
When adding just the items foo,bar to the list items, you are referencing variables that do not exist. self.ui.foo != foo
bball
Oh, okay. Duh... I see that now. Thanks!
kchau