Portál AbcLinuxu, 25. dubna 2024 14:35


Dotaz: GTK socket

28.7.2012 19:26 mika_hakkinen | skóre: 7 | olbramkostel
GTK socket
Přečteno: 344×
Odpovědět | Admin

Ahoj, potřeboval bych do mé aplikace vložit jinou aplikaci, třeba xterm. Píši v pythonu a používám GTK. GTK má na to metodu socket, pres kterou lze vlozit jinou aplikaci Na netu jsem našel spousty návodů jak to udělat. Problém je ten, že již do vytvořené aplikace, kde použivám gtk.DrawingArea, nemůžu použít gtk.Socket. Mám to napsané takhle:

 

self.window = gtk.Window()

socket = gtk.Socket()

gtk.gdk.threads_init()

self.window.resize(320,240)

self.window.connect("delete_event", self.delete_event)

self.window.connect("destroy", self.destroy)

self.window.show_all() self.darea = gtk.DrawingArea()

self.darea.connect("expose-event", self.menu_manager)

self.window.add(self.darea) #zde je problem GtkWarning: Attempting to add a widget with type GtkSocket to a GtkWindow, but as a #GtkBin subclass a GtkWindow can only contain one widget at a time; it already contains a widget of type #GtkDrawingArea

self.window.add(socket)

self.window.show_all()

xid = str(socket.get_id())

print xid - pak nekde jinde zavolam xterm s parametrem xid a mel by se ukazat.

 

 

pak kdyz zakomentuji radek, ktery prida DrawingArea, tak to funguje dobre. diky za tip

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

28.7.2012 20:11 chrono
Rozbalit Rozbalit vše Re: GTK socket
Odpovědět | | Sbalit | Link | Blokovat | Admin
A prečo majú byť na tom istom mieste dva elementy?
29.7.2012 08:41 mika_hakkinen | skóre: 7 | olbramkostel
Rozbalit Rozbalit vše Re: GTK socket
Pouzit dva elementy neni podminkou. Jen to nedokazi vymyslet tak, aby bud gtk.socket byl v gtk.drawingarea. nebo naopak. idealni by byl v gtk.drawingarea prostor pro vlozeni toho gtk.socket.

diky za nakopnuti
29.7.2012 14:33 l4m4
Rozbalit Rozbalit vše Re: GTK socket
GtkDrawingArea není kontejner, takže to nejde. Za chvíli bude někdo chtít strkat GtkSocket do scrollbarů...

Buď použij kontejner, který bude obsahovat GtkDrawingArea a GtkSocket. Nebo namísto GtkDrawingArea použij GtkLayout.

GtkDrawingArea je celkově takový widget na nic, oproti vytvoření nového jednoduchého widgetu se ušetří trochu kódu, u složitějšího se neušetří nic nebo nic, co by stálo za řeč.
29.7.2012 20:31 mika_hakkinen | skóre: 7 | olbramkostel
Rozbalit Rozbalit vše Re: GTK socket
Tak po dni badani jsem na nic neprisel. DrawingArea jsem nahradil za Layout. To bylo bez potizi. Ale jak vlozit do Gtk.Layout ten Gtk.socket nevim. Mam to napsane takhle:

self.layout = gtk.Layout(None, None)

self.layout.set_size(320,240)

self.layout.put(self.socket,10,10)

self.layout.put(self.darea,0,0)

self.window.add(self.layout)

a kdyz to spustim zadna chyba se neobjevi. A gtk.socket vypise XID, tak to jakoby funguje, ale nezobrazuje. Nekde jsem nasel, ze se prvne musi nastavit velikost, ale gtk.socket nic takoveho nema.

uz tedy nevim
29.7.2012 20:50 l4m4
Rozbalit Rozbalit vše Re: GTK socket
Nahradit je nahradit. Kreslit můžeš přímo na ten Layout.
import gtk

window = gtk.Window()
window.connect('destroy', gtk.main_quit)
gtk.gdk.threads_init()
window.resize(320,240)
layout = gtk.Layout()
window.add(layout)

socket = gtk.Socket()
socket.set_size_request(200, 100)
layout.put(socket, 40, 40)

window.show_all()
xid = str(socket.get_id())
print(xid)

gtk.main()
Akorát mi v tom xtermu nefunguje vstup z klávesnice, a to ani když explicitně přidám key-press and key-release eventy a nastavím, že může mít keyboard focus. S tím nevím, co dělat, Socket/Plug jsem nikdy v praxi nepouži...
30.7.2012 17:21 mika_hakkinen | skóre: 7 | olbramkostel
Rozbalit Rozbalit vše Re: GTK socket
tak uz to funguje, pomohlo set_size_request.
Pavel Stárek avatar 30.7.2012 11:38 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: GTK socket
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nevím, školy nemám, ale asi takhle: http://faq.pygtk.org/index.py?req=show&file=faq19.015.htp Po spuštění xtermu, je potřeba zjistit jeho window id a to pak zadat tomu socketu.
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
Pavel Stárek avatar 30.7.2012 11:40 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: GTK socket
Á pardon, ten xterm a jeho window id se ti zřejmě vytváří. Takže má odpověď je zcela irelevantní :-)
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
2.8.2012 21:19 mika_hakkinen | skóre: 7 | olbramkostel
Rozbalit Rozbalit vše Re: GTK socket
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jeste bych potreboval do toho gtk.socket pridat treba tlacitko. diky
2.8.2012 21:31 chrono
Rozbalit Rozbalit vše Re: GTK socket
Prečo práve do toho objektu? Nemôže byť vedľa neho?
3.8.2012 15:25 mika_hakkinen | skóre: 7 | olbramkostel
Rozbalit Rozbalit vše Re: GTK socket
bohuzel to je design aplikace. Stacilo by, kdyby to mohl byt popup obrazek, ktery by byl uplne nad vsemi widgety. diky za tip
3.8.2012 15:34 chrono
Rozbalit Rozbalit vše Re: GTK socket
Nenapadá mi zmysluplné využitie niečoho takého, každopádne môžeš vyskúšať dať GtkSocket a aj ten obrázok do GtkFixed.
6.8.2012 20:07 mika_hakkinen | skóre: 7 | olbramkostel
Rozbalit Rozbalit vše Re: GTK socket
Odpovědět | | Sbalit | Link | Blokovat | Admin
jeste bych potreboval poradit. Potreboval bych tem widgetum nastavit ruzne pruhlednost a prenaset je do popredi a pozadi. diky
Josef Kufner avatar 7.8.2012 18:34 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: GTK socket
Odpovědět | | Sbalit | Link | Blokovat | Admin
Obsah socketu je samostatné okno a pokud ho chceš překrýt něčím v obalujícím okně, máš smůlu a bude to pod socketem. Na průhlednost a podobné vychytávky zapomeň (leda by jsi se chtěl patlat s xlib, ale to nechceš).

Pokud můžeš upravit vestavovanou aplikaci, udělej z toho knihovnu a/nebo client-server architekturu.

Pokud nemůžeš, tak dej svoje widgety vedle a nějak to zamaskuj.
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.