searchctrl EVT_LEFT_DOWN 事件不起作用(wxpython)

LEE*_*LEE 2 wxpython click textctrl mouseevent

当我单击 searchctrl 输入一些代码时,我尝试使用 searchctrl 创建鼠标事件。\n我的目标是当我单击 searchctrl(编辑为文本或 wirte)时,将启动虚拟键盘(板载)。我发现searchctrl是低类别的textctrl。但 wx.EVT_LEFT_DOWN 不起作用\n我怎样才能让它工作(我认为这是可能的。因为当我单击 searchctrl(文本)时 value=\xe2\x80\x9d\xe2\x80\x9d(提示)消失)

\n\n

完整代码

\n\n
# -*- coding: utf-8 -*-\n\nimport wx\n\n[wxID_FRAME1, wxID_FRAME1TEXTCTRL1,\n] = [wx.NewId() for _init_ctrls in range(2)]\n\nclass MyFrame1 ( wx.Frame ):\n\n    def __init__( self, parent ):\n        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY,\n            title = wx.EmptyString, pos = wx.DefaultPosition,\n            size = wx.Size( 700,400 ),\n          #  style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL\n        )\n\n        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )\n\n        # Create controls\n        sb = wx.StaticBox(self, -1, "Options")\n        searchBtnOpt = wx.CheckBox(self, -1, "Search button")\n        searchBtnOpt.SetValue(True)\n        cancelBtnOpt = wx.CheckBox(self, -1, "Cancel button")\n        menuBtnOpt   = wx.CheckBox(self, -1, "Search menu")\n\n        self.search = wx.SearchCtrl(self,size=(200,-1), style=wx.TE_PROCESS_ENTER)\n        #self.search.SetHint(self, love)\n        # Setup the layout\n        self.Bind(wx.EVT_LEFT_DOWN, self.OnClick, self.search)\n        box = wx.StaticBoxSizer(sb, wx.VERTICAL)\n        box.Add(searchBtnOpt, 0, wx.ALL, 5)\n        box.Add(cancelBtnOpt, 0, wx.ALL, 5)\n        box.Add(menuBtnOpt,   0, wx.ALL, 5)\n\n        sizer = wx.BoxSizer(wx.HORIZONTAL)\n        sizer.Add(box, 0, wx.ALL, 15)\n        sizer.Add((15,15))\n        sizer.Add(self.search, 0, wx.ALL, 15)\n\n##         self.tc = wx.TextCtrl(self)  # just for testing that heights match...\n##         sizer.Add(self.tc, 0, wx.TOP, 15)\n\n        self.SetSizer(sizer)\n\n        self.textCtrl1 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL1, name=\'textCtrl1\',\n              parent=self, pos=wx.Point(120, 80), size=wx.Size(100, 21),\n              style=0, value=\'textCtrl1\')\n        self.textCtrl1.Bind(wx.EVT_LEFT_DOWN, self.OnClick)\n\n\n        # Set event bindings\n        self.Bind(wx.EVT_CHECKBOX, self.OnToggleSearchButton, searchBtnOpt)\n        self.Bind(wx.EVT_CHECKBOX, self.OnToggleCancelButton, cancelBtnOpt)\n        self.Bind(wx.EVT_CHECKBOX, self.OnToggleSearchMenu,   menuBtnOpt)\n        self.search.Bind(wx.EVT_LEFT_DOWN, self.OnClick)\n        self.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, self.OnSearch, self.search)\n        self.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, self.OnCancel, self.search)\n        self.Bind(wx.EVT_TEXT_ENTER, self.OnDoSearch, self.search)\n        ##self.Bind(wx.EVT_TEXT, self.OnDoSearch, self.search)\n\n\n    def OnToggleSearchButton(self, evt):\n        self.search.ShowSearchButton( evt.GetInt() )\n\n    def OnToggleCancelButton(self, evt):\n        self.search.ShowCancelButton( evt.GetInt() )\n\n    def OnToggleSearchMenu(self, evt):\n        if evt.GetInt():\n            self.search.SetMenu( self.MakeMenu() )\n        else:\n            self.search.SetMenu(None)\n\n    def OnClick(self, event):\n        print "333"\n\n    def OnSearch(self, evt):\n        print "555"\n\n    def OnCancel(self, evt):\n        self.log.write("OnCancel")\n\n    def OnDoSearch(self, evt):\n        self.log.write("OnDoSearch: " + self.search.GetValue())\n        print "555"\n\n\n    def MakeMenu(self):\n        menu = wx.Menu()\n        item = menu.Append(-1, "Recent Searches")\n        item.Enable(False)\n        for txt in [ "You can maintain",\n                     "a list of old",\n                     "search strings here",\n                     "and bind EVT_MENU to",\n                     "catch their selections" ]:\n            menu.Append(-1, txt)\n        return menu\n    def __del__( self ):\n        pass\n\n\n    # Virtual event handlers, overide them in your derived class\n    def searchCtrlOnSearchButton( self, event ):\n        print("SearchCtrl SEARCH_BTN clicked")\n        event.Skip()\n\n    def searchCtrlOnTextEnter( self, event ):\n        print("SearchCtrl ENTER pressed")\n        event.Skip()\n\n\nif __name__ == \'__main__\':\n    app = wx.PySimpleApp( 0 )\n    frame = MyFrame1( None )\n    frame.Show()\n    app.MainLoop()\n
Run Code Online (Sandbox Code Playgroud)\n\n

这部分是问题所在

\n\n
    self.search = wx.SearchCtrl(self,size=(200,-1), style=wx.TE_PROCESS_ENTER)\n    self.Bind(wx.EVT_LEFT_DOWN, self.OnClick, self.search)\n\n    self.textCtrl1 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL1, name=\'textCtrl1\',\n          parent=self, pos=wx.Point(120, 80), size=wx.Size(100, 21),\n          style=0, value=\'textCtrl1\')\n    self.textCtrl1.Bind(wx.EVT_LEFT_DOWN, self.OnClick)\n\n    self.search.Bind(wx.EVT_LEFT_DOWN, self.OnClick)\n\ndef OnClick(self, event):\n    print "333"\n
Run Code Online (Sandbox Code Playgroud)\n

nep*_*x32 6

从更高层次的角度来看,捕获搜索控件上的鼠标事件大概不是一个好主意,但最好绑定到文档中列出的内容(文本输入、按 Enter、按搜索/清除按钮、. ..)。

也就是说,我使用 wxPython WIT(小部件检查工具)来可视化正在发生的情况。通过在主循环之前添加以下内容来激活它:

    ...
    import wx.lib.inspection
    wx.lib.inspection.InspectionTool().Show()

    app.MainLoop()
Run Code Online (Sandbox Code Playgroud)

如果您浏览左侧窗格中的小部件树,您可以看到它SearchCtrl有一个TextCtrl名为 的子部件text。如果您进一步单击TextCtrl小部件树中的 并激活工具栏中的“事件”窗口,您会看到它正在获取所有事件wx.EVT_LEFT_DOWN。我不知道为什么搜索控件不从文本控件继承鼠标事件。它收到了EVT_TEXT!您可以执行以下操作:

    self.search = wx.SearchCtrl(#...

    search_txtctrl = self.search.FindWindowByName('text')
    search_txtctrl.Bind(wx.EVT_LEFT_DOWN, self.OnClick)

def OnClick(self, evt)
    # do your stuff
    evt.Skip()
Run Code Online (Sandbox Code Playgroud)

此时不要忘记跳过,否则wx.TextCtrl搜索控件中将不会收到任何鼠标按下事件!