Интегрируйте приложение в GTK+2 с Nautilus 3 (используя GTK+3). Это возможно?

У меня есть приложение, написанное с использованием PyGTK (GTK+2). Я хотел бы интегрировать его с Nautilus через расширение (что-то, что я пытаюсь изучить). На моем текущем рабочем столе установлены GNOME3 и Nautilus 3, написанные на GTK+3, а расширения для Nautilus используют PyGObject.

Могу ли я интегрировать свое приложение в GTK+2 с Nautilus 3? (пока без переноса моего приложения на GTK+3). Любой намек?

Я планирую перенести свое приложение на GTK+3 (PyGObject), но это потребует больше времени, чем сейчас.


person Jan    schedule 16.07.2012    source источник


Ответы (2)


Да, это возможно. Например, вы можете использовать Nautilus для вызова вашей программы с файлами или каталогами в качестве аргументов. Программа, которую вы вызываете, может быть написана с помощью любого инструментария или даже быть просто сценарием оболочки.

Крошечный пример или расширение:

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.

person gpoo    schedule 19.07.2012

Проверьте Introspection Porting:

Обратите внимание, что вы не можете выполнить миграцию на полпути: если вы попытаетесь импортировать и gtk, и gi.repository.Gtk, вы не получите ничего, кроме зависаний и сбоев программы, поскольку вы пытаетесь работать с одной и той же библиотекой двумя разными способами. . Однако вы можете смешивать статические и GI привязки разных библиотек, таких как dbus-python и gi.repository.Gtk.

Итак, это зависит от того, как реализованы плагины Nautilus.

person Havok    schedule 18.07.2012
comment
Это именно мой вопрос, как мне реализовать расширение Nautilus, чтобы избежать конфликтов (если есть простой способ). - person Jan; 18.07.2012