我有一个包含16个正方形的pygtk表,每个正方形包含一个标签。标签名称为:label1,label2,label3,...,label16。
我还有一个计时器可以触发每个 n 秒。当计时器被触发时,其中一个方块被突出显示(只需将其字体大小设置为18,将其余字体大小设置为12)。
如果只有3个标签,代码将是这样的:
def update_grid(self):
if self.timer_id is not None:
self.__actual_choice = (self.__actual_choice % 16)+1
if self.__actual_choice == 1:
self.label1.modify_font(self.__font_big)
self.label2.modify_font(self.__font_small)
self.label3.modify_font(self.__font_small)
elif self.__actual_choice == 2:
self.label1.modify_font(self.__font_small)
self.label2.modify_font(self.__font_big)
self.label3.modify_font(self.__font_small)
elif self.__actual_choice == 3:
self.label1.modify_font(self.__font_small)
self.label2.modify_font(self.__font_small)
self.label3.modify_font(self.__font_big)
但是有16个标签,代码会很大。我想知道在python中是否有办法做类似的事情:
self.(label+"i").modify_font(self.__font_small)
答案 0 :(得分:6)
你可以使用其他人建议的内置函数getattr()
:
label = getattr(self, 'label%d' % i)
label.modify_font(self.__font_small)
但实际上,您最好将label
存储在list
中。最后有很多带数字的变量是可怕的code smell。
for index, label in enumerate(self.labels):
if index == self.__actual_choice:
label.modify_font(self.__font_big)
else:
label.modify_font(self.__font_small)
答案 1 :(得分:2)
您应该查看getattr
函数。
答案 2 :(得分:2)
使用getattr
:
self.__actual_choice = (self.__actual_choice % 16)+1
for i in range(1, 17):
if i == self.__actual_choice:
getattr(self, 'label' + str(i)).modify_font(self.__font_big)
else:
getattr(self, 'label' + str(i)).modify_font(self.__font_small)
答案 3 :(得分:1)
为什么在世界上你会把它写成一堆if
语句?
modify_fonts = [getattr(self, "label%s" % i).modify_font for i in xrange(1, 17)]
您现在有一个可以为每个标签调用的方法列表。也就是说,modify_fonts[0]
是self.label1.modify_font
,依此类推。然后你循环调用它们。
actual_choice = (self.__actual_choice % 16) # no +1, we're zero-based
for index, modify_font in enumerate(modify_fonts):
modify_font(self.__font_big if index == actual_choice else self.__font_small)