我正在创建一个可点击的图像(带有文本+位图)窗口小部件类作为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
?
答案 0 :(得分:1)
没有神奇的解决方案,您需要在Bind()
和myimg
上致电mytxt
。当然,您可以在MyBitmapButton
内部将其封装在自定义控件中,即绑定到其子控件的双击并将它们转发到按钮本身 - 然后您现有的btn.Bind()
将够了。
唯一(丑陋)替代方案是处理wx.App
级别的事件,因为它获取所有事件,原则上,您可以检查双击是否来自主框架子项然后处理它。但这是不好的做法,我不建议这样做。