为什么插入符号在焦点事件后从 TextCtrl 小部件中消失?
Why does the caret disappear from a TextCtrl widget after a focus event?
我正在使用 wxPython-Phoenix
在 MS Windows 8.1 上编写一个计算器应用程序,我希望在用户将值输入其中一个参数后立即执行计算领域。为此,我使用由任何参数字段生成的 wx.EVT_KILL_FOCUS
来生成触发计算方法的命令事件。一切正常,但插入符号出现在参数字段中(由 TextCtrl 小部件实现)。
通过 Tab 键或鼠标将焦点设置在某个字段上并将其移动(再次通过 Tab 键或鼠标)到不同的字段后 - 插入符号从 TextCtrl 小部件中消失,永远不会 return!当您在该 TextCtrl 小部件上调用 GetCaret() 方法时,return 值为 None.
见附件示例。小部件仍然接受输入并显示它,但没有插入符号。
如何将插入符号恢复到正确的位置?还是一开始就不会失去它?
我试过在 TextCtrl 中设置一个新的插入符号,但它不跟随文本输入。由于应用程序需要高度交互,我希望触发事件是失去焦点而不是按钮(以尽量减少点击次数)
import wx
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
super(MyFrame, self).__init__(*args, **kwargs)
self.InitUI()
def InitUI(self):
# setting up the Input panel
panel = wx.Panel(self)
self.lbl1 = wx.StaticText(panel,wx.ID_ANY,'Some Text:')
self.txt1 = wx.TextCtrl(panel,wx.ID_ANY,style=wx.TE_RIGHT)
self.lbl2 = wx.StaticText(panel,wx.ID_ANY,'Some Other Text:')
self.txt2 = wx.TextCtrl(panel,wx.ID_ANY,style=wx.TE_RIGHT)
infgsz = wx.FlexGridSizer(2,2,15,15)
infgsz.AddMany([(self.lbl1,0,wx.ALIGN_LEFT),\
(self.txt1,0,wx.ALIGN_LEFT),\
(self.lbl2,0,wx.ALIGN_LEFT),\
(self.txt2,0,wx.ALIGN_LEFT)])
self.txt1.Bind(wx.EVT_KILL_FOCUS,self.OnInput)
self.txt2.Bind(wx.EVT_KILL_FOCUS,self.OnInput)
box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(infgsz, flag= wx.EXPAND | wx.ALL, border=15)
panel.SetSizer(box)
self.SetSize((280, 140))
self.SetTitle('TextCtrl Demo')
self.Centre()
def OnInput(self, e):
if e.GetId() == self.txt1.GetId():
self.lbl2.SetForegroundColour(wx.ColourDatabase().Find('RED'))
self.lbl1.SetForegroundColour(wx.ColourDatabase().Find('BLACK'))
else:
self.lbl1.SetForegroundColour(wx.ColourDatabase().Find('BLUE'))
self.lbl2.SetForegroundColour(wx.ColourDatabase().Find('BLACK'))
self.Refresh()
def main():
app = wx.App()
frame = MyFrame(None)
frame.Show()
app.MainLoop()
if __name__ == '__main__':
main()
上面的应用程序显示了 2 行文本。在每一行中,左侧有一个标签(wx.StaticText
小部件),右侧有一个 TextCtrl
小部件。当您在任一行的 TextCtrl
小部件中输入文本并将焦点移动到另一个 TextCtrl
小部件时,相应的标签前景色(文本颜色)变为红色或蓝色,而另一个标签变为黑色.但是,在没有任何可见原因的情况下,插入符号从顶部 TextCtrl
小部件中消失并且永远不会 return 出现! (至少在 MS Windows 8.1 上)。
The documentation明确告诉你
The focus event handlers should almost invariably call wxEvent::Skip() on their event argument to allow the default handling to take place.
并继续解释说,不这样做可能会导致各种问题——例如您正在观察的问题。
将 e.Skip()
添加到您的事件处理程序以修复它。
我正在使用 wxPython-Phoenix
在 MS Windows 8.1 上编写一个计算器应用程序,我希望在用户将值输入其中一个参数后立即执行计算领域。为此,我使用由任何参数字段生成的 wx.EVT_KILL_FOCUS
来生成触发计算方法的命令事件。一切正常,但插入符号出现在参数字段中(由 TextCtrl 小部件实现)。
通过 Tab 键或鼠标将焦点设置在某个字段上并将其移动(再次通过 Tab 键或鼠标)到不同的字段后 - 插入符号从 TextCtrl 小部件中消失,永远不会 return!当您在该 TextCtrl 小部件上调用 GetCaret() 方法时,return 值为 None.
见附件示例。小部件仍然接受输入并显示它,但没有插入符号。
如何将插入符号恢复到正确的位置?还是一开始就不会失去它?
我试过在 TextCtrl 中设置一个新的插入符号,但它不跟随文本输入。由于应用程序需要高度交互,我希望触发事件是失去焦点而不是按钮(以尽量减少点击次数)
import wx
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
super(MyFrame, self).__init__(*args, **kwargs)
self.InitUI()
def InitUI(self):
# setting up the Input panel
panel = wx.Panel(self)
self.lbl1 = wx.StaticText(panel,wx.ID_ANY,'Some Text:')
self.txt1 = wx.TextCtrl(panel,wx.ID_ANY,style=wx.TE_RIGHT)
self.lbl2 = wx.StaticText(panel,wx.ID_ANY,'Some Other Text:')
self.txt2 = wx.TextCtrl(panel,wx.ID_ANY,style=wx.TE_RIGHT)
infgsz = wx.FlexGridSizer(2,2,15,15)
infgsz.AddMany([(self.lbl1,0,wx.ALIGN_LEFT),\
(self.txt1,0,wx.ALIGN_LEFT),\
(self.lbl2,0,wx.ALIGN_LEFT),\
(self.txt2,0,wx.ALIGN_LEFT)])
self.txt1.Bind(wx.EVT_KILL_FOCUS,self.OnInput)
self.txt2.Bind(wx.EVT_KILL_FOCUS,self.OnInput)
box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(infgsz, flag= wx.EXPAND | wx.ALL, border=15)
panel.SetSizer(box)
self.SetSize((280, 140))
self.SetTitle('TextCtrl Demo')
self.Centre()
def OnInput(self, e):
if e.GetId() == self.txt1.GetId():
self.lbl2.SetForegroundColour(wx.ColourDatabase().Find('RED'))
self.lbl1.SetForegroundColour(wx.ColourDatabase().Find('BLACK'))
else:
self.lbl1.SetForegroundColour(wx.ColourDatabase().Find('BLUE'))
self.lbl2.SetForegroundColour(wx.ColourDatabase().Find('BLACK'))
self.Refresh()
def main():
app = wx.App()
frame = MyFrame(None)
frame.Show()
app.MainLoop()
if __name__ == '__main__':
main()
上面的应用程序显示了 2 行文本。在每一行中,左侧有一个标签(wx.StaticText
小部件),右侧有一个 TextCtrl
小部件。当您在任一行的 TextCtrl
小部件中输入文本并将焦点移动到另一个 TextCtrl
小部件时,相应的标签前景色(文本颜色)变为红色或蓝色,而另一个标签变为黑色.但是,在没有任何可见原因的情况下,插入符号从顶部 TextCtrl
小部件中消失并且永远不会 return 出现! (至少在 MS Windows 8.1 上)。
The documentation明确告诉你
The focus event handlers should almost invariably call wxEvent::Skip() on their event argument to allow the default handling to take place.
并继续解释说,不这样做可能会导致各种问题——例如您正在观察的问题。
将 e.Skip()
添加到您的事件处理程序以修复它。