为什么在焦点事件之后,插入符号会从TextCtrl小部件中消失?

时间:2019-06-11 07:05:23

标签: python wxwidgets wxpython-phoenix wxtextctrl

我正在使用wxPython-Phoenix在MS Windows 8.1上编写一个计算器应用程序,我希望一旦用户在参数字段之一中输入一个值,就可以执行计算。为此,我使用了由任何参数字段生成的wx.EVT_KILL_FOCUS来生成触发计算方法的命令事件。一切正常,但参数字段中插入符号的外观(由TextCtrl小部件实现)。

通过Tab键或鼠标将焦点设置在某个字段上并将焦点(再次通过Tab键或鼠标)移动到另一个字段之后-插入符从TextCtrl小部件中消失了,再也无法返回!当您在该TextCtrl小部件上调用GetCaret()方法时,返回值为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()

上面的应用程序显示两行文本。在每一行的左侧都有一个标签(wx.StaticText小部件),在右侧有一个TextCtrl小部件。当您在任一行的TextCtrl小部件中输入文本并将焦点移至另一TextCtrl小部件时,相应的标签前景色(文本颜色)变为RED或BLUE,另一标签为BLACK。 。但是,在没有任何可见原因的情况下,插入符号从顶部TextCtrl小部件中消失,并且再也没有返回! (至少在MS Windows 8.1上)。

1 个答案:

答案 0 :(得分:1)

The documentation明确告诉您

  

焦点事件处理程序几乎总是应在其事件参数上调用wxEvent :: Skip()以允许进行默认处理。

并继续解释说,不这样做可能会导致各种问题-例如您正在观察的问题。

e.Skip()添加到事件处理程序中以对其进行修复。