我使用PyGTK(GTK + 2)编写了一个应用程序。我想通过扩展(我正在努力学习的东西)将它与Nautilus集成。我当前的桌面有GNOME3和Nautilus 3,用GTK + 3编写,Nautilus的扩展使用PyGObject。
我可以将我的GTK + 2应用程序与Nautilus 3集成吗? (没有将我的应用程序移植到GTK + 3)。任何提示?
我打算将我的应用程序移植到GTK + 3(PyGObject),但它需要比现在更多的时间。
答案 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)
请注意,您无法中途迁移:如果您尝试同时导入两者 gtk和gi.repository.Gtk,除了程序挂起,你什么也得不到 崩溃,因为你试图使用两个相同的库 不同的方法。您可以混合不同的静态和GI绑定 但是,例如dbus-python和gi.repository.Gtk。
所以,这取决于Nautilus插件的实现方式。