2013-01-10 56 views
1

我使用這個代碼來檢索和顯示來自網絡的圖像:的GtkWindow只能包含一個小部件在一個時間

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)

不知道爲什麼它不會讓我把多個小部件,沒有任何人有一個解決方案?

+0

downvoting無解釋便宜! –

回答

2

事實上包裝就是答案。

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

看看widget packing。基本上,您使用window.add添加一個特殊的包裝容器,該包裝容器又包含主要小部件和/或附加容器。

素描:

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

GTK窗口只能包含一個孩子。 如果您想要添加多個小部件,那麼您需要一個佈局容器(如箱子或網格)來容納它們。 GTK2中的框很好,但在GTK3中,開發人員建議切換到網格,因爲框在GTK3中已被棄用。

相關問題