2014-01-22 21 views
0

我創建了一個可點擊的圖像(文本+位圖)窗口小部件類作爲wx.PyControl的子類。我想綁定雙擊這個小部件上的任何地方(文本,位圖,背景)到某個動作(在這裏稱爲OnClick)。從wx.PyControl的任意位置綁定雙擊

不幸的是,它不起作用:使用此代碼,當我點擊MyBitmapButton小部件的位圖或文本部分時,不會調用OnClick。 (見下面的問題)。

import wx 

class MyBitmapButton(wx.PyControl): 
    def __init__(self, parent, id=-1, bmp=None, label='blah', pos = wx.DefaultPosition, size=(166,220), 
       style = 0, validator = wx.DefaultValidator, 
       name = "mybitmapbutton"): 
     style |= wx.BORDER_NONE 
     wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name) 
     myimg = wx.StaticBitmap(self, -1, bmp, pos=(8,8), size=(150,150)) 
     mytxt = wx.StaticText(self, -1, label, (6,165)) 

class MainFrame(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, -1, title, size=(800,600)) 
     sizer = wx.WrapSizer() 

     img = wx.Image('background.png', wx.BITMAP_TYPE_PNG) 
     bmp = wx.BitmapFromImage(img) 
     btn = MyBitmapButton(self, -1, bmp, label='a') 

     sizer.Add(btn, 0, wx.ALL, 10) 
     self.Sizer = wx.BoxSizer(wx.VERTICAL) 
     self.Sizer.Add(sizer, 0, wx.EXPAND|wx.LEFT|wx.RIGHT, 8) 
     self.Show() 

     # ################ 
     # Why don't these bindings detect double-click anywhere on the widget ? 
     btn.Bind(wx.EVT_LEFT_DCLICK, self.OnClick) 
     self.Bind(wx.EVT_LEFT_DCLICK, self.OnClick, btn) 

    def OnClick(self, event): 
     print 'Clicked' 

app = wx.App(0) 
frame = MainFrame(None, 'Test') 
app.MainLoop() 

如何綁定雙擊按鈕以OnClick地方?

回答

1

沒有神奇的解決方案,您還需要撥打Bind()myimgmytxt以及。當然,您可以在MyBitmapButton內部將它封裝在您的自定義控件中,即綁定到其子控件的雙擊並將它們轉發到按鈕本身 - 那麼您現有的btn.Bind()就足夠了。

唯一的(醜陋的)選擇是在wx.App級別處理事件,因爲它獲取所有這些事件,原則上,您可以檢查雙擊是否來自主框架子代並進行處理。但這是不好的做法,我不建議這樣做。

+0

謝謝@VZ。你是否有一個示例代碼添加到'MyBitmapButton'內部,以便綁定子控件的雙擊,以便我可以在'MainFrame'的'__init__'中做一個唯一的綁定? – Basj

+0

如何讓我可以在'MainFrame'中做綁定? (因爲'class MyBitmapButton(wx.PyControl)'是一個泛型類,我不能在'MyBitmapButton'的定義中做每個特定的綁定...) – Basj

+0

不,對不起,我沒有任何示例Python代碼。但它應該很簡單:在MyBitmapButton中提供你自己的'BindToDClick(func)',並從它調用'self.Bind(func)','myimg.Bind(func)'和'mytext.Bind(func)' 。 –

相關問題