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()

問題は、インスタンスがメソッドに2回渡されることです。

クリックすると印刷されます:

(<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):。最初のものは最も意味があるようです...

UPDATE : 引数として渡さない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 は次の方法でコールバックを呼び出します。widgetcb(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 に答える