3

私はこのコードを使用して、Webから画像を取得して表示しています。

class Display(object):

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect('destroy', self.destroy)
        self.window.set_border_width(10)

        self.image = gtk.Image()
        response = urllib2.urlopen('http://image.url/image.jpg').read()

        pbuf = gtk.gdk.PixbufLoader()
        pbuf.write(response)
        pbuf.close()
        self.image.set_from_pixbuf(pbuf.get_pixbuf())

        self.window.add(self.image)
        self.image.show()
        self.window.show()

    def main(self):
        gtk.main()

    def destroy(self, widget, data=None):
        gtk.main_quit()

それは機能しますが、画像の下にテキスト/入力ボックスを表示したいと思います(後でテキストを取得するため)。以下を追加しましたself.image.show()

self.entry = gtk.Entry()
self.window.add(self.entry)
self.entry.show()

ただし、この警告が表示されてから実行すると、入力ボックスが表示されません。

ee.py:31:GtkWarning:タイプGtkEntryのウィジェットをGtkWindowに追加しようとしていますが、GtkBinサブクラスとして、GtkWindowには一度に1つのウィジェットしか含めることができません。すでにタイプGtkImageself.window.add(self.entry)のウィジェットが含まれています

なぜ複数のウィジェットを配置できないのかわかりませんが、誰かがこれに対する解決策を持っていますか?

4

3 に答える 3

3

確かにパッキングが答えです。

import gtk
import urllib2
class Display(object):

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect('destroy', self.destroy)
        self.window.set_border_width(10)

        # a box underneath would be added every time you do 
        # vbox.pack_start(new_widget)

        vbox = gtk.VBox()
        self.image = gtk.Image()
        response = urllib2.urlopen('http://1.bp.blogspot.com/-e-rzcjuCpk8/T3H-mSry7PI/AAAAAAAAOrc/Z3XrqSQNrSA/s1600/rubberDuck.jpg').read()

        pbuf = gtk.gdk.PixbufLoader()
        pbuf.write(response)
        pbuf.close()
        self.image.set_from_pixbuf(pbuf.get_pixbuf())

        self.window.add(vbox)
        vbox.pack_start(self.image, False)
        self.entry = gtk.Entry()
        vbox.pack_start(self.entry, False)

        self.image.show()
        self.window.show_all()

    def main(self):
        gtk.main()

    def destroy(self, widget, data=None):
        gtk.main_quit()

a=Display()
a.main()
于 2013-01-10T18:46:16.287 に答える
1

ウィジェットのパッキングを見てください。基本的に、window.addを使用して、メインウィジェットや追加のコンテナーを含む特別なパッケージコンテナーを追加します。

スケッチ:

hbox = HBox()
window.add(hbox)
hbox.pack_start(widget1)
hbox.pack_start(widget2)
window.show_all()
于 2013-01-10T18:43:35.037 に答える
0

GTKウィンドウには子を1つだけ含めることができます。複数のウィジェットを追加する場合は、それらを保持するためのボックスやグリッドなどのレイアウトコンテナが必要です。ボックスはGTK2で問題ありませんが、GTK3ではボックスが非推奨になったため、開発者はグリッドに切り替えることをお勧めします。

于 2013-07-31T22:31:41.653 に答える