Пробую написать индикатор для Юнити на питоне. Вот код:
#!/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 будет так:
def foo(args):
do_smth
foo #callable
foo() # call itself
Но как же тогда правильно передавать аргументы в таких ситуациях?..