2009-06-17 1 views
5

Desidero che alcune applicazioni assomiglino a widget all'interno della mia applicazione Python.Come incorporare alcune finestre dell'applicazione nella mia applicazione utilizzando qualsiasi framework GUI Python

Questo è tutto. Non ho bisogno di alcuna interazione tra loro. Sono interessato a soluzioni nel qualsiasi toolkit GUI per Windows e x Windows.

Sarebbe bello avere una soluzione con Tkinter ma non è fondamentale.

+0

Penso che sia altamente dipendente dalla piattaforma. Si prega di dare maggiori dettagli. – yairchu

risposta

5

Utilizzando GTK su X Windows (ad esempio Linux, FreeBSD, Solaris), è possibile utilizzare il protocollo XEMBED per incorporare i widget utilizzando gtk.Socket. Sfortunatamente, l'applicazione che stai lanciando deve supportarla esplicitamente in modo che tu possa dirla per incorporarla. Alcune applicazioni non supportano questo. In particolare, non riesco a trovare un modo per farlo con Firefox.

Tuttavia, ecco un esempio di programma che verrà eseguito sia un terminale X o di una sessione di Emacs all'interno di una finestra GTK:

import os 
import gtk 
from gtk import Socket, Button, Window, VBox, HBox 

w = Window() 
e = Button("Emacs") 
x = Button("XTerm") 
s = Socket() 
v = VBox() 
h = HBox() 
w.add(v) 
v.add(s) 
h.add(e) 
h.add(x) 
v.pack_start(h, expand=False) 

def runemacs(btn): 
    x.set_sensitive(False); e.set_sensitive(False) 
    os.spawnlp(os.P_NOWAIT, "emacs", 
     "emacs", "--parent-id", str(s.get_id())) 

def runxterm(btn): 
    x.set_sensitive(False); e.set_sensitive(False) 
    os.spawnlp(os.P_NOWAIT, "xterm", 
     "xterm", "-into", str(s.get_id())) 

e.connect('clicked', runemacs) 
x.connect('clicked', runxterm) 
w.show_all() 
gtk.main() 
+0

Ti capita di sapere perché embeded xterm non riceve eventi di tastiera? – MeanEYE

+0

@MeanEYE, potrebbe essere una questione di messa a fuoco? – Hibou57

+1

@ Hibou57 oh, ho risolto questo problema molto tempo fa. :) Grazie per lo sforzo. Quello che ho fatto è stato 'object.child_focus (gtk.DIR_TAB_FORWARD)', 'object' è il socket. – MeanEYE

0

Non abbastanza reputazione per commentare glifi rispondere. Per far funzionare xterm, oltre alle osservazioni di cui sopra bisogna aggiungere anche

XTerm*allowSendEvents: True 

a ~/.Xresources. (e forse ricaricare quelli, con xrdb -load ~/.Xresources)