插座(socket):这里指宿主窗口,它可以让其它应用程序,把窗口嵌入到它里面。如,任务栏就是一个插座(socket)。
插头(plug): 顾名思义,它就是被嵌入的窗口,可以插入到插座(socket)上。相对任务栏而言,应用程序的窗口就是插头(plug)。
插头(plug)/插座(socket)两者可以在同一个应用中,也可以在不同的应用程序中。在同一个应用程序里,这种做法意义不大,而且可以说是自找麻烦。大多数情况下,它们分别位于不同的进程之中,一个插座(socket)窗口可以容纳多个插头(plug)窗口中,而一个插头(plug)窗口只能处于一个插座(socket)窗口之中。
plug:
plug = gtk.Plug(socket_id)
id = plug.get_id()
socket:
socket = gtk.Socket()
socket.add_id(window_id)
plug = gtk.Plug(0L)
socket.add_id(plug)
window_id = socket.get_id()
plug = gtk.Plug(window_id)
=========
socket:
#!/usr/bin/python import string import pygtk pygtk.require('2.0') import gtk,sys window = gtk.Window() window.show() socket = gtk.Socket() socket.show() window.add(socket) print "Socket ID=", socket.get_id() window.connect("destroy", gtk.mainquit) def plugged_event(widget): print "I (",widget,") have just had a plug inserted!" socket.connect("plug-added", plugged_event) if len(sys.argv) == 2: socket.add_id(long(sys.argv[1])) gtk.mainloop()
plug:
#!/usr/bin/python import pygtk pygtk.require('2.0') import gtk,sys Wid = 0L if len(sys.argv) == 2: Wid = long(sys.argv[1]) plug = gtk.Plug(Wid) print "Plug ID=", plug.get_id() def embed_event(widget): print "I (",widget,") have just been embedded!" plug.connect("embedded", embed_event) entry = gtk.Entry() entry.set_text("hello") def entry_point(widget): print "You've changed my text to '%s'" % widget.get_text() entry.connect("changed", entry_point) plug.connect("destroy", gtk.mainquit) plug.add(entry) plug.show_all() gtk.mainloop()