避免在wxPython中阻止kill focus事件的命令事件

时间:2014-02-09 16:25:16

标签: focus wxpython

我正在编写一个类来左键单击任务栏图标生成一个框架。所需的行为是在失去焦点时此帧消失,因此我将wx.EVT_KILL_FOCUS事件绑定到LeftClickFrame()对象中的面板。

如果框架中只有wx.StaticText窗口小部件,则效果正常,但如果我添加wx.HyperlinkCtrl,则wx.EVT_KILL_FOCUS事件不再触发。我使用wx.RadioButton小部件获得相同的阻止行为,但不会使用wx.StaticBitmap

我认为这与wx.HyperlinkCtrlwx.RadioButton窗口小部件都是控件和发出命令事件这一事实有关,但我不清楚我必须做些什么才能重新安排我的课程因此,当存在这些控件中的一个或两个时,仍会处理wx.EVT_KILL_FOCUS事件。

我有以下代码:

class LeftClickFrame(wx.Frame):

    def __init__(self, frame):
        super(LeftClickFrame, self).__init__(frame,
                                             style=wx.FRAME_NO_TASKBAR|
                                                   wx.CAPTION)
        self.tbicon = frame.taskbar_icon
        self.tbicon.options_window = self
        self.InitUI()

    def InitUI(self):
        self.panel = wx.Panel(self, wx.ID_ANY) 
        self.panel.Bind(wx.EVT_KILL_FOCUS, self.Close)

        self.main_vbox = wx.BoxSizer(wx.VERTICAL)
        statuses_hbox = self.GetStatusesVBox()
        self.main_vbox.Add(statuses_hbox)
        self.main_vbox.Add((-1, 10))        
        links_vbox = self.GetLinksVBox()
        self.main_vbox.Add(links_vbox, flag=wx.TOP|wx.CENTER, border=20)
        self.panel.SetSizer(self.main_vbox)

    def GetStatusesVBox(self, statuses):
        statuses_vbox = wx.BoxSizer(wx.VERTICAL)
        for status in statuses:
            battery_statuses_txt = wx.StaticText(self.panel,
                                                 wx.ID_ANY, status)
            statuses_vbox.Add(battery_statuses_txt,
                              flag=wx.TOP|wx.LEFT, border=10)
        return statuses_vbox

    def GetLinksVBox(self):
        links_vbox = wx.BoxSizer(wx.VERTICAL)
        link1 = wx.HyperlinkCtrl(self.panel, wx.ID_ANY, 'Adjust screen brightness')
        link1.Bind(wx.EVT_HYPERLINK, self.tbicon.LaunchPowerOptions)
        links_vbox.Add(link1, flag=wx.CENTER|wx.TOP, border=5)
        return links_vbox

    def Close(self):
        self.tbicon.options_window.Destroy()
        self.Destroy()

1 个答案:

答案 0 :(得分:2)

您可以尝试EVT_ACTIVATE而不是EVT_KILL_FOCUS,因为它在您的情况下不起作用。 您可以使用event.GetActive()来检查此帧是否处于焦点。

def InitUI(self):
    self.panel = wx.Panel(self, wx.ID_ANY)
    self.Bind(wx.EVT_ACTIVATE, self.Close)  #bind it to Frame



def Close(self, evt):
    if evt.GetActive() != True:
        #do window close