在wx.PyControl上双击绑定

时间:2014-01-22 22:46:01

标签: python events wxpython wxwidgets

我正在创建一个可点击的图像(带有文本+位图)窗口小部件类作为wx.PyControl的子类。我想绑定双击在此小部件上的任何位置(在文本上,在位图上,在背景上)到某个操作(此处称为OnClick)。

不幸的是,它不起作用:使用此代码,当我单击OnClick小部件的位图或文本部分时,不会调用MyBitmapButton。 (见下面的问题)。

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 个答案:

答案 0 :(得分:1)

没有神奇的解决方案,您需要在Bind()myimg上致电mytxt。当然,您可以在MyBitmapButton内部将其封装在自定义控件中,即绑定到其子控件的双击并将它们转发到按钮本身 - 然后您现有的btn.Bind()将够了。

唯一(丑陋)替代方案是处理wx.App级别的事件,因为它获取所有事件,原则上,您可以检查双击是否来自主框架子项然后处理它。但这是不好的做法,我不建议这样做。