3

我正在使用此代码从网络检索和显示图像:

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 一次只能包含一个小部件;它已经包含一个 GtkImage self.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 窗口只能包含一个孩子。如果要添加多个小部件,则需要一个布局容器(例如框或网格)来容纳它们。盒子在 GTK2 中很好,但在 GTK3 中,开发人员建议切换到网格,因为盒子现在在 GTK3 中已弃用。

于 2013-07-31T22:31:41.653 回答