LINUX.ORG.RU

Python Gtk.TreeView и Popup Menu

 , , , ,


0

1

Доброго времени суток! Не могу разобраться вот с такой штукой: У меня есть Gtk.Tree View в котором есть какая то информация и есть Gtk.Popup Menu, которое выпадает при щелчке правой кнопки мышки на каком нибудь элементе TreeView. Я могу клацать по пунктам меню и запускать функции. Но у меня не получается передать информацию из строки TreeView на которой я вызвал меню в мои функции. Подскажите пожалуйста как это сделать. Вот так вот я вызываю меню:

 self.treeviewR_popup = builder.get_object('treeviewR_popup')
        if event.button == 3:
            x = int(event.x)
            y = int(event.y)
            timez = event.time
            pthinfo = treeView_right.get_path_at_pos(x, y)
            if pthinfo is not None:
                path, col, cellx, celly = pthinfo
                treeView_right.grab_focus()
                treeView_right.set_cursor(path, col, 0)
                self.treeviewR_popup.popup(None, None, None, None, event.button, event.time)

★★★

Но у меня не получается передать информацию из строки TreeView на которой я вызвал меню в мои функции.

pthinfo = treeView_right.get_path_at_pos(x, y)

А где проблема?

baverman ★★★
()
Ответ на: комментарий от nuxster

Справка рулит и педалит. Последним параметром передаются аргументы для функции popup, туда и суй свои данный, а уже в обработчике переадвай своей функции, которая у тебя там вызывается, делов то. http://www.pygtk.org/docs/pygtk/class-gtkmenu.html#method-gtkmenu--popup

xterro ★★★★★
()
Ответ на: комментарий от xterro

Если я так делаю, то при вызове меню у меня скрипт вот так ругается:

self.popup_for_device(None, parent_menu_shell, parent_menu_item, func, data, button, activate_time)
TypeError: When passing None for a callback userdata must also be None

nuxster ★★★
() автор топика
Ответ на: комментарий от nuxster

Ну так тебе же написано, английским по белому, «если вместо коллбэка передаёшь None, то и данные передаваемые в него тоже должны быть None» А у тебя коллбэк - None, но данные для него пихаешь.

xterro ★★★★★
()
Ответ на: комментарий от xterro

Ну а если я не использую callback? Как можно без него? Я на пунктах меню просто отлавливаю сигналы и передаю управление соответствующей функции. С callback'ами я ни когда не встречался и пока не очень понимаю как они работают, по этому и не применю.

nuxster ★★★
() автор топика
Последнее исправление: nuxster (всего исправлений: 1)
Ответ на: комментарий от nuxster

Так, что-то я запутался. Тебе надо передать некую инфу в обработчик нажатия пункта меню, так? если так, то заводи глобальную/член класса переменную и в неё заноси результат, потом в обработчике нажатия пункта меню, читай эту переменную. Если я правильно понял.

xterro ★★★★★
()
Ответ на: комментарий от xterro

Ну я собсно так и собирался делать. Просто думал, может можно как то без глобальных переменных обойтись малой кровью.

nuxster ★★★
() автор топика
Ответ на: комментарий от nuxster

Да, можешь создать «глобальную» переменную и передавать её в коллбэк пункта меню, а при вызове popup, меняешь эту переменную как тебе надо. В результате, в момент нажатия пункта меню, в обработчик передадутся нужные данные.

xterro ★★★★★
()
Ответ на: комментарий от xterro

Если вам не трудно покажите пример кода. Я что то не совсем понял как работает callback-функция в данном случае.

nuxster ★★★
() автор топика
Последнее исправление: nuxster (всего исправлений: 1)
Ответ на: комментарий от nuxster

Ну а если я не использую callback?

А как мне это передать в другую функцию?

Ты или крестик сними или трусы одень ))

baverman ★★★
()
Ответ на: комментарий от nuxster

У тебя два варианта.

1) Передавай коллбек и data
2) Сохраняй данные в каком-нибудь контексе, не обязательно глобальном.

// Я слишком стар уже и ленив чтобы код набросать.
// Можешь посмотреть мои pygtk проекты https://github.com/baverman uxie, typetrainer, snaked.

baverman ★★★
()
Ответ на: комментарий от baverman

Спасибо добрый человек! Сделал вторым способом. Спасибо за линк.

nuxster ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.