2

これはうまくいきません:

    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 が 2 回使用され、GTK が気に入らないことです。.copy() メソッドはありますか? または、プレーンなバニラのディープコピーを使用する必要がありますか?

編集: GTK でオブジェクトを複製するデフォルトの方法はないようです。この場合、Factory がそのトリックを行います。

GTK 警告:

app/gui.py:248: GtkWarning: gtk_box_pack: assertion `child->parent == NULL' failed
hbox_errlog.pack_start(image_log)
4

4 に答える 4

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

于 2009-08-24T10:59:29.750 に答える
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 ではうまくいきました。たぶんこれは遅いかもしれませんが、使用するのはいいことです:)

于 2011-05-14T15:53:37.627 に答える
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()、両方のボタンに同じオブジェクトを使用することは理にかなっているはずです...それは単なるイメージです。

編集 重複を避けるために(やり過ぎのように思えますが)、同じ画像から 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リソース管理と関係がありますか?

于 2009-08-24T10:50:49.113 に答える