2011-10-09 3 views
2

gtk.EventBox 자식에서 다른 자식으로 신호를 보내려고합니다.위젯에서 위젯으로 사용자 지정 신호

TypeError : unknown signal name: message-send

이유 : 초기화 HeadMode (라인 75)에

는 오류가있어?

#!/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() 

답변

1

당신은 당신이 내뿜는 냉온 또는 당신이이 일을하는 위치에 상관없이 obj.emit('message-send', ...) 또는 obj.connect('message-send', ...) 연결되지 않은 개체에 대한 message-send 신호를 정의해야합니다.

HeadMode 클래스에 대해 message-send 신호를 정의하지 않았습니다.

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

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

은 아마 당신이 그런 짓을하려는 : 그래서,이 라인은 잘못

관련 문제