在Nautilus扩展中使用Python的GTK
下面的代码
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解释的步骤,我能够看到我错误代码生成的错误信息。