【问题标题】:Bind double-click from everywhere on a wx.PyControl在 wx.PyControl 上的任意位置绑定双击
【发布时间】:2014-02-13 06:17:39
【问题描述】:

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

不幸的是,它不起作用:使用此代码,当我单击 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

【问题讨论】:

    标签: python events wxpython wxwidgets


    【解决方案1】:

    没有神奇的解决方案,您还需要在myimgmytxt 上调用Bind()。当然,您可以在MyBitmapButton 中执行此操作,将其封装在您的自定义控件中,即绑定到其子控件上的双击并将它们转发到按钮本身——那么您现有的btn.Bind() 就足够了。

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

    【讨论】:

    • 谢谢@VZ。您是否有要在MyBitmapButton 中添加的示例代码,以便在子控件上绑定双击,以便我可以在MainFrame__init__ 中进行唯一的绑定?
    • 如何使我可以在MainFrame 中进行绑定? (因为class MyBitmapButton(wx.PyControl)是一个泛型类,我不能在MyBitmapButton的定义中做每一个特定的绑定...)
    • 不,抱歉,我没有任何示例 Python 代码。但它应该足够简单:在MyBitmapButton 中提供您自己的BindToDClick(func),并从中调用self.Bind(func)myimg.Bind(func)mytext.Bind(func)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2020-09-16
    • 1970-01-01
    • 2012-01-22
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多