将GTK + 2中的应用程序与Nautilus 3(使用GTK + 3)集成。这可能吗?

时间:2012-07-16 03:55:15

标签: gtk pygtk gtk3 pygobject nautilus

我使用PyGTK(GTK + 2)编写了一个应用程序。我想通过扩展(我正在努力学习的东西)将它与Nautilus集成。我当前的桌面有GNOME3和Nautilus 3,用GTK + 3编写,Nautilus的扩展使用PyGObject。

我可以将我的GTK + 2应用程序与Nautilus 3集成吗? (没有将我的应用程序移植到GTK + 3)。任何提示?

我打算将我的应用程序移植到GTK + 3(PyGObject),但它需要比现在更多的时间。

2 个答案:

答案 0 :(得分:1)

是的,有可能。例如,您可以使用Nautilus以文件或目录作为参数调用程序。您调用的程序可以使用任何工具包编写,甚至可以只是一个shell脚本。

一个小例子或扩展名:

from gi.repository import Nautilus, GObject
from urllib import unquote

PROGRAM_NAME = '/path/to/your/program'

class MyExtension(GObject.GObject, Nautilus.MenuProvider):
    def __init__(self):
        pass

    def call_my_program(self, menu, files):
        # Do whatever you want to do with the files selected
        if len(files) == 0:
            return

        # Strip the URI format to plain file names
        names = [ unquote(file.get_uri()[7:]) for file in files ]

        argv = [ PROGRAM_NAME ] + names

        GObject.spawn_async(argv, flags=GObject.SPAWN_SEARCH_PATH)

    def get_file_items(self, window, files):
        # Show the menu if there is at least on file selected
        if len(files) == 0:
            return

        # We care only files (local files)            
        for fd in files:
            if fd.is_directory() or fd.get_uri_scheme() != 'file':
                return

        item = Nautilus.MenuItem(name='MyExtensionID::MyMethodID',
                                 label='Do something with my program...')
        item.connect('activate', self.call_my_program, files)

        return item,

扩展名是使用GObject Introspection(Nautilus 3)编写的,它是通用的:您可以调用任何您希望接受文件作为参数的外部程序。关键是GObject.spawn_async()

get_file_items是Nautilus在用户与文件交互时调用的方法。在那里,您可以绑定上下文菜单(使用Nautilus.MenuItem())。然后,将该菜单与调用程序的方法(call_my_program())连接。

您可以在方法get_file_items中创建其他过滤器。例如,仅在选择了文本普通文件时才显示上下文菜单(使用fd.is_mime_type())。你可以做任何你想到的事情。注意只执行非阻塞操作,否则可以阻止Nautilus。

要测试扩展程序,您可以将其安装在~/.local/share/nautilus-python/extensions

答案 1 :(得分:0)

检查Introspection Porting

  

请注意,您无法中途迁移:如果您尝试同时导入两者   gtk和gi.repository.Gtk,除了程序挂起,你什么也得不到   崩溃,因为你试图使用两个相同的库   不同的方法。您可以混合不同的静态和GI绑定   但是,例如dbus-python和gi.repository.Gtk。

所以,这取决于Nautilus插件的实现方式。