wxPython SetFocus() 不工作

wxPython SetFocus() not working

我正在尝试在 wxPython 中的 window 上使用 SetFocus()。我不确定它在 Mac 上应该是什么样子,但据我所知,当我调用 window.SetFocus() 和 window.HasFocus( ) returns 错误。下面是一些简化的示例代码:

app = wx.App()

frame = wx.Frame(None, -1, '')
box = wx.StaticBox(frame, -1, "")
sizer = wx.StaticBoxSizer(box, orient=wx.HORIZONTAL)
text = wx.StaticText(frame, label="Some Text")
sizer.Add(text, wx.ALIGN_LEFT|wx.ALL, border=10)
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(sizer)
frame.SetSizer(main_sizer)

frame.Centre()
frame.Show()
text.SetFocus()
print 'text.HasFocus?', text.HasFocus()

app.MainLoop()

wxPython 版本“2.9.2.4”和“3.0.2.0”存在此问题。有任何想法吗?

编辑:

看起来 StaticText 小部件无法接受焦点(window.AcceptFocus())returns 错误)。在那种情况下,是否有一种简单的、可以接受的方式来突出显示 window 像这样?或者,是否可以更改 window 是否可以接受焦点?

由于它是静态文本,因此可以说没有任何内容可以接收焦点,因为您无法单击它。
尝试稍微修改您的代码以查看如何设置焦点并使用 event.focus 来查看焦点的变化。

import wx
def onFocus(event):
    print "widget received focus!"

def onKillFocus(event):
    print "widget lost focus!"

app = wx.App()

frame = wx.Frame(None, -1, '')
box = wx.StaticBox(frame, -1, "")
sizer = wx.StaticBoxSizer(box, orient=wx.VERTICAL)
text0 = wx.StaticText(frame,label="1st Item")
text0_input = wx.TextCtrl(frame, wx.ID_ANY, size=(345,25))
text = wx.StaticText(frame, label="Some Text")
text_input = wx.TextCtrl(frame, wx.ID_ANY, size=(345,25))
sizer.Add(text0, wx.ALIGN_LEFT|wx.ALL, border=10)
sizer.Add(text0_input, wx.ALIGN_LEFT|wx.ALL, border=10)
sizer.Add(text, wx.ALIGN_LEFT|wx.ALL, border=10)
sizer.Add(text_input, wx.ALIGN_LEFT|wx.ALL, border=10)
text0_input.Bind(wx.EVT_SET_FOCUS, onFocus)
text0_input.Bind(wx.EVT_KILL_FOCUS, onKillFocus)

main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(sizer)
frame.SetSizer(main_sizer)

frame.Centre()
frame.Show()
text_input.SetFocus()
#print 'text_input.HasFocus?', text_input.HasFocus()

app.MainLoop()

wx.StaticText 小部件不接受焦点。如果你只是想把你的 window 放在前面,你可以使用框架的 Raise 方法。大多数其他小部件确实允许您将焦点设置在它们上面,以便您可以编辑它们。

如果您想突出显示 wx.StaticText 小部件中的某些文本,您可以尝试更改其背景颜色。这应该适用于大多数情况。

回答您评论中提出的第二个问题。
当你说设置背景颜色会创建一个非常薄的高光时,我不确定你指的是什么。
您可以通过启用或禁用在任何给定时刻将注意力吸引到相关或不相关的按钮。您还可以根据它们是启用、禁用还是一时兴起来更改它们的颜色。

例如:

        self.button.Disable()
        self.button.SetBackgroundColour(wx.NullColour)

        self.button.Enable()
        self.button.SetBackgroundColour('gold')    

设置背景颜色应该会改变整个按钮的颜色。
您还可以更改前景色,这会更改任何给定按钮上的文本颜色。