2012-08-09 3 views
0

У меня возникла проблема в том, что мне нужно испускать данные на основе данных, которые я получаю из аппаратного потока. В идеале я хотел бы передать сигнал с пакетом данных.Как передать событие gtk.gdk со строкой в ​​виде пакета данных в Python

Я не знаю, что заполнить для ???? ниже.

Нужно ли мне создать собственный класс мероприятий?

Что-то вроде этого:

import gtk.gdk as gdk 
import gtk.glade as glade 

class ApplicationFrame(object): 
    def __init__(self, *args, **kwargs): 
     ... 
     self.glade = glade.XML(ui_filepath) 
     self.window = self.glade.get_widget(self.widget_name) 
     # for keystrokes: 
     self.window.add_events(gtk.gdk.KEY_PRESS_MASK) 
     self.window.connect("key-press-event", self.default_handler) 
     # for my special event ???? 
     self.window.add_events(gtk.gdk.????) 
     self.window.connect("????", self.default_handler) 
     ... 

    def emit_signal(self, name, data): 
     event = gdk.Event(gdk.????) 
     event.name = name 
     event.data = data 
     self.window.emit(event) 

    def default_handler(self, widget, event): 
     name, data = self.extract_data_from(event) 
     # do something special with the information... 

Заранее спасибо!

Edit: Final реализация (только показывая новые функции/дополнения) ...

class ApplicationFrame(Ui_ApplicationFrame): 
    """Standard Application Frame for Application""" 
    __gsignals__ = { 
     'data-received': (gobject.SIGNAL_RUN_FIRST, 
          gobject.TYPE_NONE, 
          (gobject.TYPE_PYOBJECT,)), 
    } 

    ... 

    def handle_new_data(self, data): 
    """Callback routine when data arrives on bus""" 
     self.window.emit('data-received', data) 

    def do_data_received(self, data): 
    """Callback routine for emitted 'data-received' signal""" 
    ... 

... 
gobject.type_register(ApplicationFrame) 

ответ

1

Не определяйте другой gdk.Event. Они используются только для представления событий X11 или их эквивалентов на других платформах. Вместо этого вам необходимо наследовать свой класс от gobject.GObject, а затем определить член словаря с магическим именем __gsignals__.

Как это описано here.

Как это:

class ApplicationFrame(gobject.GObject): 
    __gsignals__ = { 
     'data-received': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) 
    } 

    def do_data_recieved(self, data): 
     # default handler 
+0

PS. Вот как это делается в PyGTK, который уже вышел. Рассмотрите перенос вашей программы на GTK 3 и PyGObject. – ptomato

+0

Мне бы очень хотелось, но я в настоящее время застрял с Python 2.5 и более старой версией PyGTK. Спасибо вам за понимание, хотя! Я рассмотрю это прямо сейчас. –