Пользовательский сигнал от виджета до виджета

попробуйте отправить сигнал от одного пользователя gtk.EventBox к другому.

на init HeadMode (строка 75) появилась ошибка:

TypeError: неизвестное имя сигнала: message-send

Зачем?

#!/usr/bin/env python # -*- coding: utf8 -*- import pygtk pygtk.require('2.0') import gtk import gobject def Destroy(widget): gtk.main_quit() class CustomEventBox(gtk.EventBox): def __init__(self): super(CustomEventBox, self).__init__() self.press_hid = self.connect("button_press_event", self.on_press) self.release_hid = self.connect("button_release_event", self.on_release) self.set_custom_color() self.show() def on_press(self, widget, event): print "v: " + widget.label.get_text() widget.pressed() def on_release(self, widget, event): print "^: " + widget.label.get_text() widget.released() def pressed(self): pass def released(self): pass def set_custom_color(self): pass class OrderBox(CustomEventBox): def __init__(self, label_text): super(OrderBox, self).__init__() self.label = gtk.Label(label_text) self.add(self.label) self.label.show() def set_custom_color(self): bg = self.get_colormap().alloc_color('white') self.modify_bg(gtk.STATE_NORMAL, bg) self.emit('message-send', 'normal') released = set_custom_color def pressed(self): bg = self.get_colormap().alloc_color('green') self.modify_bg(gtk.STATE_NORMAL, bg) self.emit('message-send', 'pressed') gobject.type_register(OrderBox) gobject.signal_new('message-send', OrderBox, gobject.SIGNAL_RUN_FIRST | gobject.SIGNAL_ACTION, gobject.TYPE_NONE, (gobject.TYPE_STRING, )) class HeadMode(CustomEventBox): def __init__(self, mode): super(HeadMode, self).__init__() self.mode = mode self.label = gtk.Label('') align = gtk.Alignment(0.1, 0.5, 0, 0) align.add(self.label) align.show() self.add(align) self.set_custom_mode(self.mode) print gobject.signal_list_names(OrderBox) self.connect('message-send', self.on_message) def on_message(self, widget): print widget def set_custom_mode(self, mode, data=None): self.label.set_label(mode) # gobject.type_register(HeadMode) class MainWindow(object): def __init__(self): window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.set_title("Signal Demo") window.connect("destroy", Destroy) window.set_border_width(8) vbox = gtk.VBox() window.add(vbox) head = gtk.HBox() head.pack_start(HeadMode('start'), False, True, 4) head.show() vbox.pack_start(head, False, True, 4) table = gtk.Table(3, 3, False) vbox.pack_start(table) vbox.show() for cx in range(3): for cy in range(3): if cy < 3 or (cy == 3 and cx <=5): label_text = "11300%i0%i" % (cx+1, cy+1) else: label_text = "" event_box = OrderBox(label_text) table.attach(event_box, cx, cx+1, cy, cy+1, xpadding=4, ypadding=4) # More things you need an X window for ... event_box.realize() table.show() # window.fullscreen() window.show() def main(): gtk.main() return 0 if __name__ == "__main__": MainWindow() main() 

2 Solutions collect form web for “Пользовательский сигнал от виджета до виджета”

Вы должны определить message-send для объекта, который вы используете, или подключаете obj.emit('message-send', ...) или obj.connect('message-send', ...) независимо от того, где вы находитесь делая это.

Вы не определили message-send сигнала для класса HeadMode . Итак, эта строка неверна:

  self.connect('message-send', self.on_message) 

Может быть, вы хотите сделать что-то вроде этого:

  self.order_box.connect('message-send', self.on_message) 

Попробуйте создать новый сигнал, как описано здесь:

http://zetcode.com/tutorials/pygtktutorial/signals/

  • Как сделать редактируемый столбец для конкретного ребенка в pygtk
  • Редактирование атрибутов / свойств GtkWidget
  • gtk3 + и python rgba конвертировать в hex
  • Значки на складе не отображаются на кнопках
  • Как установить poppler в ubuntu 15.04?
  • Как установить PyGI (Python Gobject Introspection) в Windows?
  • Как отображать непрерывные данные в окне py-gtk?
  • Поиск размера рабочей области (размер экрана меньше панели задач) с помощью GTK
  • Python - лучший язык программирования в мире.