GtkWindow一次只能包含一个小部件



我使用这个代码来检索和显示来自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一次只能包含一个小部件;它已经包含了一个GtkImage类型的小部件self.window.add (self.entry)

不知道为什么它不会让我放置一个以上的小部件,有人有一个解决方案吗?

包装的确是答案。

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()

看看小部件打包。实际上,您使用窗口。add添加一个特殊的包装容器,该容器又包含主要的小部件和/或附加的容器。

素描:

hbox = HBox()
window.add(hbox)
hbox.pack_start(widget1)
hbox.pack_start(widget2)
window.show_all()

一个GTK窗口只能包含一个子窗口。如果你想添加多个小部件,那么你需要一个布局容器,比如一个框或网格来容纳它们。方框在GTK2中很好,但在GTK3中,开发人员建议切换到网格,因为GTK3现在不赞成方框。

相关内容

  • 没有找到相关文章

最新更新