2

PyGTK(GTK + 2)を使用して作成されたアプリケーションがあります。拡張機能(私が学ぼうとしていること)を介してNautilusと統合したいと思います。私の現在のデスクトップにはGNOME3とNautilus3があり、GTK + 3で記述されており、Nautilusの拡張機能はPyGObjectを使用しています。

GTK + 2のアプリケーションをNautilus3と統合できますか?(私のアプリケーションをGTK + 3に移植することはまだありません)。ヒントはありますか?

アプリケーションをGTK+3(PyGObject)に移植することを計画していますが、現在よりも時間がかかります。

4

2 に答える 2

1

はい、可能です。たとえば、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,

拡張機能はGObjectIntrospection(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ます。

于 2012-07-19T04:13:39.637 に答える
0

イントロスペクションの移植を確認します。

移行を途中で行うことはできないことに注意してください: gtk と gi.repository.Gtk の両方をインポートしようとすると、同じライブラリを 2 つの異なる方法で操作しようとしているため、プログラムがハングしてクラッシュするだけです。 . ただし、dbus-python や gi.repository.Gtk など、さまざまなライブラリの静的バインディングと GI バインディングを混在させることができます。

そのため、Nautilus プラグインの実装方法によって異なります。

于 2012-07-18T04:54:12.533 に答える