Der folgende Code funktioniert einwandfrei, wenn er innerhalb von FVWM2 ausgeführt wird. Wenn Sie jedoch den Desktop auf Gnome ändern, wird das eingebettete Fenster zerstört, anstatt eingebettet zu werden.
Warum das? Was vermisse ich?...
Der Code ist wie folgt, aber im Grunde führt er nur eine Aufspaltung durch. Im Kind erstellen wir ein VPython-Fenster und lassen es für immer im Leerlauf. Im Elternteil erstellen wir ein GTK-Fenster, finden die Fenster-ID des Kindfensters heraus und versuchen, es über einen GTK::Socket einzubetten.
Beachten Sie, dass der VPython-Teil hierfür möglicherweise irrelevant ist.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
import sys
import os
import re
import time
from visual import *
def find_window_id (title):
"""Gets the OpenGL window ID."""
pattern = re.compile('0x[0-9abcdef]{7}')
proc = subprocess.Popen(['xwininfo', '-name', title],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
errors = proc.stderr.readlines()
if errors:
return None
for line in proc.stdout.readlines():
match = pattern.findall(line)
if len(match):
return long(match[0], 16)
return None
class Setting ():
"""VPython/OpenGL class."""
def __init__ (self, w=256, h=256, title='OpenGL via VPython'):
"""Initiator."""
self.width = w
self.height = h
self.title = title
self.scene = display.get_selected()
self.scene.title = self.title
self.scene.width = self.width
self.scene.height = self.height
self.sphere = sphere()
class GTKDisplay ():
def __init__ (self, winID):
"""Initiator: Draws the GTK GUI."""
import gtk
import pygtk
self.OpenGLWindowID = winID
window = gtk.Window()
window.show()
socket = gtk.Socket()
socket.show()
window.add(socket)
window.connect("destroy", lambda w: gtk.main_quit())
socket.add_id(long(self.OpenGLWindowID))
gtk.main()
def main ():
"""Main entry point."""
name = 'sphere OpenGL window'
child_pid = os.fork()
if 0 == child_pid:
sut = Setting(title=name)
else:
winID = None
while not winID:
time.sleep(.1)
winID = find_window_id(name)
try:
gui = GTKDisplay(winID)
except KeyboardInterrupt, err:
print '\nAdieu monde cruel!'
if __name__ == "__main__":
main()
PS: Ja, dies ist eine Fortsetzung vondiese FrageUndDieses hier.