использовать gtk в расширении nautilus с использованием python - PullRequest
4 голосов
/ 24 июля 2010

следующий код

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)

прекрасно работает и выдает запрошенные сообщения.

Может кто-нибудь объяснить это - или лучше - предоставить обходной путь?

(Еще лучше то, что при перемещении оповещения () - позвоните в get_file_items() сообщение отображается правильно)

1 Ответ

2 голосов
/ 22 августа 2010

В списке рассылки nautilus Ахмад Шериф обнаружил мою ошибку:

gtk.MessageDialog не работает с вашим кодом, потому что пятый аргумент должно быть либо строка, либо None, а имя переменной имеет тип nautilus.FileInfo, что означает, что вам нужно позвонить alert(name.get_name()) не просто alert(name)
Пожалуйста, обратитесь к документам для получения дополнительной информации о nautilus.FileInfo.

Спасибо Ахмаду за то, что указал на это.

Во второй публикации 1017 * Ахмад объяснил, как лучше отлаживать:

Я думаю, вы могли бы получить такую ​​отладочную информацию, если бы запустили 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 / Предпочтения / show_desktop"
  • Наконец, вам нужно перезапустить сеанс, затем попытаться выйти и запустить снова.

Кредиты идут на wrc1944 […] для решения для возрождения.

Применяя шаги, которые объяснил Ахмад, я смог увидеть сообщение об ошибке, сгенерированное моим неисправным кодом.

...