在Nautilus扩展中使用Python的GTK

4 投票
1 回答
1186 浏览
提问于 2025-04-16 01:47

下面的代码

import gtk
import nautilus
import os
def alert(message):
    """A function to debug"""
    dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, message)
    dialog.run()
    dialog.destroy()

class TestExtension(nautilus.MenuProvider):
    def __init__(self):
        pass

    def get_file_items(self, window, files):
        items = []
        """Called when the user selects a file in Nautilus."""
        item = nautilus.MenuItem("NautilusPython::test_item", "Test", "Test")
        item.connect("activate", self.menu_activate_cb, files)
        items.append(item)
        return items

    def menu_activate_cb(self, menu, files):
        """Called when the user selects the menu."""
        for name in files:
            alert(name)

没有产生任何消息。
但是

import easygui
import nautilus
import os

def alert(message):
    """A function to debug"""
    easygui.msgbox(message)

class TestExtension(nautilus.MenuProvider):
    def __init__(self):
        pass

    def get_file_items(self, window, files):
        items = []
        """Called when the user selects a file in Nautilus."""
        item = nautilus.MenuItem("NautilusPython::test_item", "Test", "Test")
        item.connect("activate", self.menu_activate_cb, files)
        items.append(item)
        return items

    def menu_activate_cb(self, menu, files):
        """Called when the user selects the menu."""
        for name in files:
            alert(name)

运行得很好,并且产生了所需的消息。

有人能解释一下这个情况吗?或者更好的是,提供一个解决办法?

(更好的是,当把 alert() 的调用放到 get_file_items() 里面时,消息就能正确显示了)

1 个回答

2

nautilus邮件列表上,Ahmad Sherif发现了我的错误:

gtk.MessageDialog在你的代码中不起作用,因为第五个参数必须是字符串或者None,而你用的变量名是nautilus.FileInfo类型的,这意味着你需要调用 alert(name.get_name()) 而不是简单地 alert(name)
更多关于nautilus.FileInfo的信息,请参考文档

感谢Ahmad指出这个问题。

第二个帖子中,Ahmad解释了如何更好地调试:

我觉得如果你从终端启动Nautilus,你可以获得这样的调试信息。 […]
你应该先退出Nautilus(nautilus -q),然后再启动它(nautilus --no-desktop)。如果[nautilus]在退出后[自动]重启了,你应该按以下方式编辑 /usr/share/applications/nautilus.desktop(备份一下是个好主意):

  • 把 "X-GNOME-AutoRestart=true" 改成 "X-GNOME-AutoRestart=false"
  • 在这一行前面加上"#"来注释掉 "X-GNOME-Autostart-Phase=Desktop"。其实我忘了我为什么这么做,但这就是我的配置 :).
  • 添加这一行 "AutostartCondition=GNOME /apps/nautilus/preferences/show_desktop"
  • 最后,你应该重启你的会话,然后再试着退出和重新启动。

感谢wrc1944 […] 提供的重启解决方案。

按照Ahmad解释的步骤,我能够看到我错误代码生成的错误信息。

撰写回答