简体   繁体   中英

Global event handlers in wxPython (Phoenix)

I'm having a problem trying to handle focus events in wxPython 3, the phoenix fork.

I'm trying to clear the value in a TextCtrl when it's focused if it still has its default value, and then restore that default value on leaving focus if the user hasn't entered a different value.

This is the handler I have:

def on_enter(self, event):
    control = wx.Window.FindFocus()
    if control.Id in TEXT_MAPPING.keys():
        if control.Value == TEXT_MAPPING[control.Id]:
            control.SetValue('')
    exit_control = event.GetWindow()
    if exit_control.Id in (TEXT_MAPPING.keys()):
        if not exit_control.GetValue():
            exit_control.SetValue(TEXT_MAPPING[exit_control.Id])
    event.Skip()

The handler itself works fine, though it's a little clunky. My issue is that I would like to bind this on a global level, such that whenever any wx.EVT_SET_FOCUS event is fired, I can have it be handled by this function.

I found this:

import wx

class MyApp(wx.App):
     def FilterEvent(self, evt):
         print evt
         return -1

app = MyApp(redirect=False)
app.SetCallFilterEvent(True)
frm = wx.Frame(None, title='Hello')
frm.Show()
app.MainLoop()

but I'm confused on how I would pass the event down to the children of MyApp .

What you can do is bind focus kill and focus select to functions, like this:

self.user_text.Bind(wx.EVT_SET_FOCUS, self.on_focus_username)
self.user_text.Bind(wx.EVT_KILL_FOCUS, self.on_deselect_username)

where self is the panel where the TextCtrl "user_text" is located".

The functions might look like this:

def on_focus_username(self, event):
    if self.user_text.GetForegroundColour() != wx.BLACK:
        self.user_text.SetForegroundColour(wx.BLACK)
        # Clear text when clicked/focused
        self.user_text.Clear()

def on_deselect_username(self, event):
    if self.user_text.GetLineLength(0) is 0:
        self.user_text.SetForegroundColour(wx.Colour(192, 192, 192))
        # Put a default message when unclicked/focused away
        self.user_text.SetValue("Enter Username")

Hope this helped, if I didn't answer something clearly/correctly let me know.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM