Question

Searching on google and I found that is impossible to using wx.TE_PROCESS_ENTER on masked TextCtrl, I try it myself to set style=wx.TE_PROCESS_ENTER then bind it with wx.EVT_TEXT_ENTER, but nothing happen. What I was trying to do is making many masked TextCtrl so user can input some value, then when enter button pressed a function called to do calculation on it.

Thanks in advance

Était-ce utile?

La solution

I'm not sure why that's eating that event, but you can simulate the same thing by binding to EVT_KEY_DOWN instead. Here's one example:

import wx
import wx.lib.masked as masked

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent=parent)

        control = ["Phone No", "(###) ###-#### x:###", "", 'F^-', "^\(\d{3}\) \d{3}-\d{4}", '','','']
        maskText = masked.TextCtrl(self, 
                                   mask = control[1],
                                   excludeChars = control[2],
                                   formatcodes  = control[3],
                                   includeChars = "",
                                   validRegex   = control[4],
                                   validRange   = control[5],
                                   choices      = control[6],
                                   choiceRequired = True,
                                   defaultValue = control[7],
                                   demo         = True,
                                   name         = control[0],
                                   style=wx.TE_PROCESS_ENTER)
        maskText.Bind(wx.EVT_KEY_DOWN, self.onEnter)

    #----------------------------------------------------------------------
    def onEnter(self, event):
        """"""
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_RETURN or keycode == wx.WXK_NUMPAD_ENTER: 
            print "you pressed ENTER!"
        event.Skip()

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Masked!")
        panel = MyPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

Autres conseils

Following this example I was able to get it working

https://www.programcreek.com/python/example/4695/wx.TE_PROCESS_ENTER

def __init__(self):
        wx.Frame.__init__(self, None,
                          pos=wx.DefaultPosition, size=wx.Size(450, 100),
                          style=wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION |
                          wx.CLOSE_BOX | wx.CLIP_CHILDREN,
                          title="BRUNO")
        panel = wx.Panel(self)

        ico = wx.Icon('boy.ico', wx.BITMAP_TYPE_ICO)
        self.SetIcon(ico)

        my_sizer = wx.BoxSizer(wx.VERTICAL)
        lbl = wx.StaticText(panel,
                            label="Bienvenido Sir. How can I help you?")
        my_sizer.Add(lbl, 0, wx.ALL, 5)
        self.txt = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER,
                               size=(400, 30))
        self.txt.SetFocus()
        self.txt.Bind(wx.EVT_TEXT_ENTER, self.OnEnter)
        my_sizer.Add(self.txt, 0, wx.ALL, 5)
        panel.SetSizer(my_sizer)
        self.Show()
        speak.Speak('''Welcome back Sir, Broono at your service.''') 

This website also explains that you can't use EVT_TEXT_ENTER if you haven't set the style to wx.TE_PROCESS_ENTER

https://wxpython.org/Phoenix/docs/html/wx.TextCtrl.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top