Python GtkWindow一次只能包含一个小部件
我正在使用此代码从web检索和显示图像:Python GtkWindow一次只能包含一个小部件,python,gtk,pygtk,gtkentry,Python,Gtk,Pygtk,Gtkentry,我正在使用此代码从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()
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()下添加了以下内容:
但是,它会发出此警告,然后我运行它,并且输入框不会出现:
ee.py:31:GtkWarning:尝试将类型为GtkEntry的小部件添加到GtkWindow,但作为GtkBin子类,GtkWindow一次只能包含一个小部件;它已经包含GtkImage类型的小部件
self.window.add(self.entry)
不知道为什么它不允许我放置多个小部件,有人有解决方案吗?看看。基本上,您可以使用window.add来添加一个特殊的打包容器,该容器依次包含主窗口小部件和/或其他容器
草图:
hbox = HBox()
window.add(hbox)
hbox.pack_start(widget1)
hbox.pack_start(widget2)
window.show_all()
包装确实是答案
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()
GTK窗口只能包含一个子窗口。
如果您想要添加多个小部件,那么您需要一个布局容器,例如一个盒子或一个网格来容纳它们。盒子在GTK2中很好,但在GTK3中,开发人员建议切换到网格,因为盒子现在在GTK3中不推荐使用
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()