Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: PyGObject - TypeError: second argument must be callable  (Прочитано 949 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
PyGObject - TypeError: second argument must be callable
« : 30 Апреля 2013, 12:26:42 »
Пробую написать индикатор для Юнити на питоне. Вот код:
Код: (Python) [Выделить]
#!/usr/bin/env python

import sys
from gi.repository import Gtk, Gdk, GLib
from gi.repository import AppIndicator3 as appindicator

class ClipboardTranslateIndicator:
    def __init__(self):
        self.ind = appindicator.Indicator.new ("example-simple-client",
                                      "indicator-messages",
                         appindicator.IndicatorCategory.APPLICATION_STATUS)
        self.ind.set_status (appindicator.IndicatorStatus.ACTIVE)
        self.ind.set_attention_icon ("indicator-messages-new")
        self.menu = Gtk.Menu()
        self.quit_item = Gtk.MenuItem('Quit')
        self.menu.append(self.quit_item)
        def quit_app(w):
            sys.exit(0)
        self.quit_item.connect('activate', quit_app)
        self.quit_item.show()
        self.ind.set_menu(self.menu)
        self.step = 0
        self.content = None
        self.cb = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
        GLib.timeout_add(10, self.handler_timeout)
    def activate(self, MenuItem):
        self.menu.reorder_child(MenuItem, 1)
        self.cb.set_text(MenuItem.get_child().get_text(), -1)
        self.cb.store()
    def get_clipboard(self):
        self.old_content = self.content
        self.content = self.cb.wait_for_text()
        if self.step != 0 or self.content == self.old_content:
            return False
        else:
            menu_item = Gtk.MenuItem(self.content)
            self.menu.append(menu_item)
            self.old_content = self.content
            menu_item.connect('activate', self.activate(menu_item))
            menu_item.show()
            return True
    def handler_timeout(self):
        self.get_clipboard()
        self.step = self.step + 1
        return True
    def main(self):
        Gtk.main()

if __name__ == "__main__":
    ind = ClipboardTranslateIndicator()
    ind.main()
 
Проблема в том, что при запуске ругается вот так (последний вывод):
    menu_item.connect('activate', activate(menu_item))
TypeError: second argument must be callable

Но ведь activate(menu_item) это вызов функции - как он может быть не callable? (Это в конце функции get_clipboard, если что чтобы быстрее найти)

Пользователь решил продолжить мысль 30 Апреля 2013, 12:51:41:
Хм. Кажется, я понял, что дело в скобках - callable будет так:
Код: (Python) [Выделить]
def foo(args):
    do_smth
foo #callable
foo() # call itself
Но как же тогда правильно передавать аргументы в таких ситуациях?..
« Последнее редактирование: 30 Апреля 2013, 12:51:41 от Phlya »
Ubuntu 14.04 (Unity), MSI GE40

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.