2012-04-25 10 views
2

私はgtk.DrawingAreaをサブクラス化しようとしています。 ここにコードの問題点があります。pyGTKサブクラス化の問題。ダブル自己メソッドに渡す

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

編集のようなものを印刷し、なぜ道、によって

答えて

1

この問題は、このような方法で解決された。..

GTKはこのようにコールバックを呼び出し、(わからない)しかし、良いアイデアではないかもしれませんいくつかのウィジェットクラスのインスタンス。だから私は明示的なインスタンス参照が必要でした。これは、クラス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) 

に置き換えなければなりません。

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 tutorialから)

をので、渡される引数は、ウィジェットやイベントになります。合計で、あなたがクラスに入っているので、これらの引数を持つでしょう(self, widget, event)

self.connectを行っているので、widgetselfと評価されます。だから、あなたは引数が(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))のようなラムダを使用する必要があります:最初のものは

UPDATEが...最も意味のようです。ちょうどdef on_mouse_dn(self, event):を使用してください。ウィジェットがあるcb(widget,event)を:それはあなたのコードがこれまでに変更の場合には...

+0

はい、私は、argsが 'self'、' widget'と 'event'であることを理解しています。しかし、「自己はウィジェット」なので、それが何であっても必要はない。 '@ staticmethod'定義を' 'self'を除外するために使うことができました。しかし、実際には静的メソッドではないので、正しい解決策ではないと私は思っています。他のオプションはありますか? – akaRem

+0

あなたの質問から、あなたは「第二の」自己がどこから来たのか分からなかったようです。私は私の答えを更新しました – jadkik94

+0

ありがとうございました。質問に不正確なことを申し訳ありません(英語は母国語ではありません)。私は、ラムダラッパーが完全に正しいわけではないと思う。特に私は多くの方法を定義しています。より洗練されたソリューションがあるようです。 – akaRem

関連する問題