Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写wxpythontextctrl焦点事件_Python_Wxpython_Wxtextctrl_Wx.textctrl_Wxformbuilder - Fatal编程技术网

如何编写wxpythontextctrl焦点事件

如何编写wxpythontextctrl焦点事件,python,wxpython,wxtextctrl,wx.textctrl,wxformbuilder,Python,Wxpython,Wxtextctrl,Wx.textctrl,Wxformbuilder,我试图在用户单击textCtrl时触发一行代码。最终目标是在单击框时突出显示框中的内容。我知道这在wx.EVT_SET_FOCUS中是可能的,但这要么是错误的,要么是我实现错了。这是我的密码: self.m_textCtrl1 = wx.TextCtrl(self.m_panel2, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(100,-1), wx.TE_LEFT)

我试图在用户单击textCtrl时触发一行代码。最终目标是在单击框时突出显示框中的内容。我知道这在wx.EVT_SET_FOCUS中是可能的,但这要么是错误的,要么是我实现错了。这是我的密码:

self.m_textCtrl1 = wx.TextCtrl(self.m_panel2, wx.ID_ANY, wx.EmptyString, 
                               wx.DefaultPosition, wx.Size(100,-1), wx.TE_LEFT)
self.m_textCtrl1.SetMaxLength(8) 
self.m_textCtrl1.SetMinSize(wx.Size(100,-1))
self.m_textCtrl1.SetMaxSize(wx.Size(100,-1))
self.m_textCtrl1.Bind(wx.EVT_SET_FOCUS, self.highlightText, self.m_textCtrl1)
这段代码能够在我想要的时候成功地触发highlightText,但是由于某种原因,光标从textCtrl中被移除,用户无法选择其位置、突出显示或退格。如有任何建议,将不胜感激。作为旁注,在wxFormBuilder中是否有这样做的方法?我使用它构建了应用程序,但无法添加焦点事件。它提供的焦点活动似乎只针对整个窗口

2014年9月19日编辑: 迈克,这是我在
gui.py
中自动生成的wxFormBuilder代码:

class OrderNumEntry ( wx.Frame ):
    def __init__( self, parent ):
        # there's a lot more stuff here, but it's irrelevant
        self.m_textCtrl1.Bind( wx.EVT_SET_FOCUS, self.highlightText )

    def __del__( self ):
        pass

    # Virtual event handlers, overide them in your derived class
    def highlightText( self, event ):
        event.Skip()
。。。这是我写的事件处理程序

import wx, gui

class OrderFrame(gui.OrderNumEntry):
    def __init__(self, parent):
        gui.OrderNumEntry.__init__(self, parent)
        # again, a lot more irrelevant stuff here

    def highlightText(self, event):
        print 'test'

事件工作正常(如我需要时在测试中打印),但我无法突出显示文本,也看不到光标。

您没有显示事件处理程序,但我猜您需要在事件结束时调用
event.Skip()
。我还想指出,您未正确绑定事件。应该是:

self.m_textCtrl1.Bind(wx.EVT_SET_FOCUS, self.highlightText)

有关完整的解释,请参见wxPython wiki:


我有event.Skip(),所以这不是问题所在。虚拟事件处理程序由wxFormBuilder自动生成,因此我所要做的就是编写一个同名的子例程。然而,我尝试了你的两个例子,我仍然有问题。你的第一个例子和我的一样。它功能正常,但我无法突出显示文本,也看不到光标。有趣的是,它还对窗口焦点事件运行代码。第二个例子似乎一点作用都没有,第一个例子对我很有用。当你点击它时,文本会高亮显示,然后光标会出现在你点击的地方,所以它不会一直高亮显示。只有在末尾有
event.Skip()
时才会发生这种情况。否则它会选择所有内容,但我无法编辑文本。您的上一个示例在事件处理程序中没有
event.Skip()
,因此您不能突出显示文本等。您是对的,先生。我假设,因为它在虚拟处理程序中已经足够好了,但现在我想起来,get无论如何都被覆盖了。是否建议所有事件处理程序都使用此选项?没有它,我的所有其他事件都可以正常工作。如果事件需要在事件链上传播,则只需要event.Skip()。在这种情况下,您希望事件继续,以便可以正常使用小部件。大多数情况下,您不需要调用Skip(),因为您定义的事件处理程序执行您希望它执行的所有操作。
self.Bind(wx.EVT_SET_FOCUS, self.highlightText, self.m_textCtrl1)