如何从修改后的字符串列表创建gtk.STOCK_*按钮?
我正在尝试创建一个简单的程序,显示所有的gtk库存按钮。
我从这个网站复制了库存ID的列表:
http://www.pygtk.org/pygtk2tutorial/ch-ButtonWidget.html
然后把它们粘贴到一个.txt文件里
接着我从这个文件创建了一个列表:
stock_file = open('stock_buttons.txt')
这样就生成了一个列表,内容像这样:
stock_button_list = stock_file.readlines()
stock_button_list[0] = ' STOCK_DIALOG_INFO/n'
所以我在每个按钮前加上'gtk.'这个前缀,并去掉多余的部分。
然后我用一个循环来创建按钮:
for each_button in stock_button_list:
self.button1 = gtk.Button(None, each_button)
但是Python把each_button当成了字符串,所以我得到了一堆按钮,按钮上的标签只是库存ID而已。 : (
如果我手动创建一个库存ID名称的列表,这样就能正常工作:
stock_button_list = [gtk.STOCK_DIALOG_INFO, gtk.STOCK_DIALOG_WARNING, etc.]
我的列表没问题,看起来和库存ID一样,但它实际上是一个字符串列表。
我该怎么让Python把字符串识别为库存按钮ID的全局变量呢?
3 个回答
一个例子:
>>> import gtk
>>> a='STOCK_DIALOG_WARNING'
>>> getattr(gtk, a)
'gtk-dialog-warning'
解决方案
正如Revil所说,可以使用getattr(obj,name)来通过字符串列表访问gtk.STOCK_*按钮。
只要确保你列表中的每个项目都与对象中的有效名称匹配,否则会出现AttributeError(属性错误)。
这是我完成的程序。它简单地显示所有的库存按钮。
*注意:为了让这个程序正常工作,你需要在同一目录下创建一个名为stock_buttons.txt的文件。只需将问题中链接的库存ID列表粘贴到文本文件中即可。
#!/usr/bin/env python
# stock_buttons.py
# Simple program to show all stock buttons
# Author: oringe
import pygtk
pygtk.require('2.0')
import gtk
class stock_buttons:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title("gtk.STOCK_[Buttons]")
self.window.connect("destroy", lambda wid: gtk.main_quit())
self.window.connect("delete_event", lambda a1,a2:gtk.main_quit())
self.window.set_border_width(10)
# This horizontal box will contain the columns
self.boxH = gtk.HBox(False, 0)
self.window.add(self.boxH)
# Pack the five columns into the HBox
self.box1 = gtk.VBox(False, 0)
self.boxH.pack_start(self.box1, True, True, 0)
self.box2 = gtk.VBox(False, 0)
self.boxH.pack_start(self.box2, True, True, 0)
self.box3 = gtk.VBox(False, 0)
self.boxH.pack_start(self.box3, True, True, 0)
self.box4 = gtk.VBox(False, 0)
self.boxH.pack_start(self.box4, True, True, 0)
self.box5 = gtk.VBox(False, 0)
self.boxH.pack_start(self.box5, True, True, 0)
# Make the list of stock buttons
stock_file = open('stock_buttons.txt')
stock_button_list = stock_file.readlines()
# Slice off excess spaces and line breaks
i = 0
for each_string in stock_button_list:
stock_button_list[i] = stock_button_list[i][2:-1]
i += 1
# Pack 15 buttons per column
i2 = 0
for button in stock_button_list:
if i2 < 15:
self.button1 = gtk.Button(stock=getattr(gtk, button))
self.box1.pack_start(self.button1, True, True, 0)
self.button1.show()
i2 += 1
elif i2 > 14 and i2 < 30:
self.button1 = gtk.Button(stock=getattr(gtk, button))
self.box2.pack_start(self.button1, True, True, 0)
self.button1.show()
i2 += 1
elif i2 > 29 and i2 < 45:
self.button1 = gtk.Button(stock=getattr(gtk, button))
self.box3.pack_start(self.button1, True, True, 0)
self.button1.show()
i2 += 1
elif i2 > 44 and i2 < 60:
self.button1 = gtk.Button(stock=getattr(gtk, button))
self.box4.pack_start(self.button1, True, True, 0)
self.button1.show()
i2 += 1
elif i2 > 59 and i2 < 75 and button != '': #Last item in list is empty''
self.button1 = gtk.Button(stock=getattr(gtk, button))
self.box5.pack_start(self.button1, True, True, 0)
self.button1.show()
i2 += 1
self.box1.show()
self.box2.show()
self.box3.show()
self.box4.show()
self.box5.show()
self.boxH.show()
self.window.show()
def main():
gtk.main()
if __name__ == "__main__":
mybuttons = stock_buttons()
main()
这很简单:
for button in stock_button_list:
self.button1=gtk.Button(stock=getattr(gtk,button))
通过使用getattr,你可以通过名字来访问一个对象或模块的所有属性。