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()\nRun 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"\nRun Code Online (Sandbox Code Playgroud)\n
从更高层次的角度来看,捕获搜索控件上的鼠标事件大概不是一个好主意,但最好绑定到文档中列出的内容(文本输入、按 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搜索控件中将不会收到任何鼠标按下事件!
| 归档时间: |
|
| 查看次数: |
1393 次 |
| 最近记录: |