pyside встроить vim

Я знаю, как встроить vim в приложение Gtk, используя сокеты, подобные следующим фрагмент

from gi.repository import Gtk
import subprocess

win=Gtk.Window()
win.set_default_size(600,800)
win.connect('delete-event', Gtk.main_quit)
editor = Gtk.Socket()
win.add(editor)
editor.connect("plug-removed", Gtk.main_quit)
subprocess.Popen(["/usr/bin/gvim", \
        "--socketid", str(editor.get_id())])
win.show_all()
Gtk.main()

Как это сделать в PySide? Я не смог найти ссылку на сокеты в pyside.

ОБНОВЛЕНИЕ (с использованием идеи JimP)

Следующий код встраивает экземпляр gvim в виджет Pyside. Однако размер окна gvim, похоже, не изменяется до полного размера родительского окна.

import sys
from PySide import QtGui
from PySide import QtCore

app = QtGui.QApplication(sys.argv)    
win = QtGui.QWidget()
win.resize(600, 800)

container = QtGui.QX11EmbedContainer(win)
container.show()
QtCore.QObject.connect(container, 
    QtCore.SIGNAL("clientClosed()"), 
    QtCore.QCoreApplication.instance().quit)
winId = container.winId()
process = QtCore.QProcess(container)
options = ["--socketid", str(winId)]
process.start("gvim", options)

win.show()    
sys.exit(app.exec_())

person Vijay Murthy    schedule 13.11.2012    source источник
comment
Нет ли способа сделать это? Если не сокеты, любой другой способ тоже подойдет. Мне просто нужно встроить vim в приложение pyside.   -  person Vijay Murthy    schedule 16.11.2012
comment
Отсутствие ответа не означает, что это невозможно. Просто никто из людей, видевших ваш вопрос, не знает, как это сделать. Вы также должны добавить ссылку на рассматриваемый PySide. Также GVim — это GTK, я не уверен, как он будет работать в среде QT.   -  person romainl    schedule 17.11.2012
comment
@romainl Хорошо .... gvim может быть невозможен, как вы говорите. Я просто ищу способ встроить vim в приложение pyside. С помощью приведенного выше кода я могу сделать это приложение Gtk. Но я не знаю, как добиться того же в приложении pyside. Что касается ссылки, я не знаю соответствующего кода. Так о какой ссылке вы говорите?   -  person Vijay Murthy    schedule 18.11.2012
comment
Я не знал, что такое PySide, поэтому искал его в Google. Вы можете добавить ссылку или две, чтобы помочь людям понять, что вам нужно. Вы видели qtvim?   -  person romainl    schedule 18.11.2012
comment
Я обновил ссылки. Я не знаю о qtvim, но, похоже, он написан на C. Я искал реализацию на pythonic. В любом случае спасибо, что указали на это.   -  person Vijay Murthy    schedule 18.11.2012


Ответы (1)


Я думаю, что ключом к тому, чтобы это заработало, будет перевод речи GTK в речь QT. Погуглите ваш код, я вижу, что Gtk.Socket говорит:

Связь между GtkSocket и GtkPlug следует протоколу XEmbed. Этот протокол также был реализован в других наборах инструментов, например. Qt, обеспечивающий такой же уровень интеграции при встраивании виджета Qt в GTK или наоборот.

Итак, возникает вопрос, как QT называет свои классы XEmbed? Погуглив, я нашел QX11EmbedContainer, в котором говорится:

PySide.QtGui.QX11EmbedContainer может встраивать виджеты XEmbed из наборов инструментов, отличных от Qt, таких как GTK+. Произвольные (не XEmbed) виджеты X11 также могут быть встроены, но при этом теряются характерные для XEmbed функции, такие как активация окна и обработка фокуса.

Эквивалентом PySide.QtGui.QX11EmbedContainer в GTK+ является GtkSocket. Соответствующий виджет KDE 3 называется QXEmbed.

В данный момент я использую не PySide, а эту страницу на QX11EmbedContainer содержит некоторый пример кода C++, который, я думаю, приведет вас туда, где вам нужно. Вам нужно будет перевести C++ на Python, но я не думаю, что это будет слишком сложно.

person JimP    schedule 19.11.2012
comment
Превосходно..! Почти готово. Я обновился с новым кодом. Есть одна проблема. Встроенный экземпляр gvim не изменяет размер при изменении размера родительского окна. Я уверен, что это что-то простое, но не знаю что. - person Vijay Murthy; 20.11.2012