2

我正在尝试继承 gtk.DrawingArea。这是代码的问题部分。

class ClusterGraph(gtk.DrawingArea):
    def __init__(self):
        super(ClusterGraph, self).__init__()
        self.add_events(gtk.gdk.BUTTON_PRESS_MASK)
        self.connect('button-press-event', self.on_mouse_dn)

    def on_mouse_dn(*args):
        print args

window = gtk.Window()
window.connect("destroy", gtk.main_quit)
window.set_default_size(300, 600)
cg = ClusterGraph()
window.add(cg)
window.show_all()
gtk.main()

问题是实例被传递给该方法两次。

点击它打印:

(<ClusterGraph object at 0x30167d8 (GtkDrawingArea at 0x2531610)>, <ClusterGraph object at 0x30167d8 (GtkDrawingArea at 0x2531610)>, <gtk.gdk.Event at 02F75F08: GDK_BUTTON_PRESS x=164,00, y=354,00, button=1>)

我的回调实际上相当于

def on_mouse_dn(self, self, event)

如何解决这个问题呢?还是正常的!?

顺便说一句,为什么打印

<ClusterGraph object at 0x30167d8 (GtkDrawingArea at 0x2531610)>

而不是像

<ClusterGraph object at 0x30167d8 (ClusterGraph at 0x2531610)>

编辑:问题是如何删除额外的参数。

4

2 回答 2

1

定义方法时,不包含 self,因此在调用时,args 将包含 self 和其他参数。

由于它是一个 pygtk 事件处理程序,它的定义应该如下所示:

   57   def button_press_event(widget, event):
   58       if event.button == 1 and pixmap != None:
   59           draw_brush(widget, event.x, event.y)
   60       return True

(来自pygtk 教程

因此,传递的参数将是小部件和事件。总的来说,因为你在上课,所以你会有这些论点(self, widget, event)

既然你在做self.connect,这意味着widget将评估为self。因此,您会产生论点是 的错觉(self, self, event)

使用def on_mouse_dn(self, widget, event):def on_mouse_dn(self, *args):。第一个似乎最有意义...

更新:要不widget作为参数传递,您必须使用像self.connect('button-press-event', lambda w, e: self.on_mouse_dn(e)). 只需使用def on_mouse_dn(self, event):. 不过,这可能不是一个好主意(不确定),以防您的代码发生变化......

于 2012-04-25T19:14:00.333 回答
1

这个问题就这样解决了。。

GTK 以这种方式调用回调:cb(widget,event)其中小部件是某个小部件类的实例。所以我需要明确的实例参考。这可以通过从类 obj 执行方法来实现。

self.connect('button-press-event', self.on_mouse_dn)

应替换为

self.connect('button-press-event', self.__class__.on_mouse_dn)

或者

self.connect('button-press-event', ClusterGraph.on_mouse_dn)

第一种形式更灵活。

于 2012-05-17T05:20:57.627 回答