这不行:
image_log = gtk.Image()
image_log.set_from_file("test.png")
self.out_button = gtk.Button()
self.out_button.add(image_log)
self.err_button = gtk.Button()
self.err_button.add(image_log)
another_box.pack_start(self.out_button, False)
another_box.pack_start(self.err_button, False)
问题是,image_log使用了两次而GTK不喜欢它。有一些.copy()方法吗?或者我应该使用普通的香草深层扫描仪?
编辑:看起来没有默认方法来克隆GTK中的对象。在这种情况下,工厂将采取行动。
GTK警告:
app/gui.py:248: GtkWarning: gtk_box_pack: assertion `child->parent == NULL' failed
hbox_errlog.pack_start(image_log)
答案 0 :(得分:2)
您可以使用工厂功能来减少代码重复
def make_image_from_file(fname):
im = gtk.Image()
im.set_from_file(fname)
return im
self.out_button.set_image(make_image_from_file(..))
有一种更自然的方式。你会喜欢它。在PyGTK 2.12 +中:
gtk.image_new_from_file(filename)
我脑子里有一些东西告诉我这个,但我没看清楚。
http://www.pygtk.org/docs/pygtk/class-gtkimage.html#function-gtk--image-new-from-file
答案 1 :(得分:2)
使用
def clone_widget(widget):
widget2=widget.__class__()
for prop in dir(widget):
if prop.startswith("set_") and prop not in ["set_buffer"]:
prop_value=None
try:
prop_value=getattr(widget, prop.replace("set_","get_") )()
except:
try:
prop_value=getattr(widget, prop.replace("set_","") )
except:
continue
if prop_value == None:
continue
try:
getattr(widget2, prop)( prop_value )
except:
pass
return widget2
所有这些尝试...除了块之外,因为并非所有属性都可以通过使用来复制 set_prop(GET_PROP)。我还没有对所有属性和小部件测试过这个,但它对gtkEntry运行良好。也许这很慢,但使用起来很好:)。
答案 2 :(得分:1)
为什么不
image_log = gtk.Image()
image_log.set_from_file("test.png")
image_logb = gtk.Image()
image_logb.set_from_file("test.png")
self.out_button = gtk.Button()
self.out_button.add(image_log)
self.err_button = gtk.Button()
self.err_button.add(image_logb)
another_box.pack_start(self.out_button, False)
another_box.pack_start(self.err_button, False)
这只是额外的2行代码,可能比克隆/复制第一个图像对象更有效。
这样您就可以独立对待out_button
和err_button
。但是对两个按钮使用相同的gtk.Image()
对象应该是有意义的......它只是一个图像。
修改强> 为了避免重复(虽然似乎 overkill ),您可以为同一图像中的gtk.Image()对象编写工厂。
def gtkimage_factory(num_objs, image_file):
i=0
imglist = []
while i<num_objs:
img_ob = gtk.Image()
img_ob.set_from_file(image_file)
imglist.append( img_ob )
i+=1
return imglist
或者沿着这些方向的东西,你明白了。但是工厂似乎有点矫枉过正,除非你正在生产负载这些东西,并且需要它们在GTK中独立生产。 然后...
image_list = gtkimg_factory(2, "test.png")
self.out_button = gtk.Button()
self.out_button.add(image_list[0])
self.err_button = gtk.Button()
self.err_button.add(image_list[1])
another_box.pack_start(self.out_button, False)
another_box.pack_start(self.err_button, False)
也许这与GTK资源管理有关?
答案 3 :(得分:0)
如果你想一次又一次地使用以某种方式排列的小部件集合,假设一个带有一个输入框和一个标签的框(如果你愿意,可以很复杂)并且想要多次使用它在您的应用程序中,根据条件需要多少个类似的选项卡,但显然可以处理使用带有空地的复合材料的不同数据。 使用 pygi(gi_composites) python 库,您可以制作自己的小部件并多次使用它们。 [https://github.com/virtuald/pygi-composite-templates][1]