2012-11-13 38 views
1

我知道嵌入VIM在Gtk application使用套接字像下面的代碼片段pyside嵌入VIM

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中的任何套接字。

UPDATE(服從跳使用的想法)

下面的代碼在Pyside控件嵌入一個GVIM實例。然而,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_()) 
+0

有沒有辦法做到這一點?如果沒有套接字,任何其他方式也很好。我只需要在pyside應用程序中嵌入vim。 –

+0

沒有答案並不意味着這是不可能的。只是沒有人看到你的問題知道如何去做。你還應該添加一個PySide的鏈接。另外GVim是GTK,我不確定它將如何在QT環境中工作。 – romainl

+0

@romainl Ok .... gvim可能無法如您所說。我正在尋找一種方法將vim嵌入到pyside應用程序中。有了上面的代碼,我可以做一個Gtk應用程序。但對於如何在pyside應用程序中實現同樣的功能卻一無所知。關於鏈接,我不知道相關的代碼。那麼你提到哪個鏈接? –

回答

2

我認爲獲得這項工作的關鍵是翻譯GTK對QT說話。在你的代碼谷歌,我看到Gtk.Socket說:

一個GtkSocket和GtkPlug組件之間的通信遵循XEMBED 協議。該協議也已在其他工具包中實現,例如 Qt,當在GTK中嵌入Qt 小部件時允許相同級別的集成,反之亦然。

那麼問題就變成了什麼QT叫他們的XEmbed類?谷歌圍繞我發現QX11EmbedContainer它說:

這是可能的PySide.QtGui.QX11EmbedContainer從比Qt的其他工具包,如GTK +嵌入XEMBED 部件。任意 (非XEmbed)X11小部件也可以嵌入,但是XEmbed專用的 功能(如窗口激活和焦點處理)則會丟失。

PySide.QtGui.QX11EmbedContainer的GTK +等價物是GtkSocket。 相應的KDE 3小部件稱爲QXEmbed。

我不是此刻正在運行PySide,但QX11EmbedContainer該頁面包含了一些例如C++代碼,我想會得到你,你需要的人。您需要將C++翻譯爲Python,但我不會太難。

+0

優秀..!差不多了。我更新了新的代碼。有一個問題。調整父窗口大小時,嵌入的gvim實例不會調整大小。我相信這是簡單的,但不知道是什麼。 –