如何在pygtk中使用相同的小部件两次?

时间:2009-08-24 10:46:59

标签: python widget pygtk

这不行:

    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)

4 个答案:

答案 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_buttonerr_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]