1
#! /usr/bin/python

#SearchCtrlProblem

import wx

class ControlPanel(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(200,200))
        self.panel = wx.Panel(self, -1)
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.panel.SetSizer(vbox)
        self.DoLayout()
        self.Centre()
        self.Show(True)        

    def DoLayout(self):
       vbox = self.panel.GetSizer()

        self.tc = tc = wx.TextCtrl(self.panel, size = (140,-1), style=wx.TE_PROCESS_ENTER)
        vbox.Add(tc, 0, wx.ALL, 15)
        tc.Bind(wx.EVT_TEXT_ENTER, self.OnTextCtrl, id=tc.GetId())

        self.sc = sc = wx.SearchCtrl(self.panel, size = (140,-1), style=wx.TE_PROCESS_ENTER)
        sc.ShowSearchButton(True)
        sc.ShowCancelButton(True)
        vbox.Add(sc, 0, wx.ALL, 15)

        sc.Bind(wx.EVT_TEXT_ENTER, self.OnSearchCtrl, id=sc.GetId())

        self.bn = bn = wx.Button(self.panel, -1, 'Reset', (140,-1))
        vbox. Add(bn, 0, wx.ALL,15)
        bn.Bind(wx.EVT_BUTTON, self.OnReset, id = bn.GetId())

        vbox.Layout()
        self.Refresh()       

    def OnTextCtrl(self, evt):
        value = self.tc.GetValue()
        self.sc.SetValue(value)

    def OnSearchCtrl(self, evt):
        value = self.sc.GetValue()
        self.tc.SetValue(value) 

    def OnReset(self, evt):
        self.panel.DestroyChildren()
        self.DoLayout()

app = wx.App()
ControlPanel(None, -1, '')
app.MainLoop()

我写了这个愚蠢的程序来演示这个问题。+ 当我运行程序时,如果我首先在搜索框中输入 sc 然后按回车,一切正常,sc 中有黑色文本。现在,我可以在文本框中输入 tc 然后按回车,sc 中的文本仍然是黑色的

  • 但是,如果我首先在搜索框 sc 中输入然后按 enter,sc 中的文本将变为灰色。从那时起,如果我尝试输入 tc 然后按回车,sc 中的文本总是灰色的。

注意:在开始输入之前,您可以通过按“重置”按钮来重置布局。该问题发生在 Linux RedHat 4.5.1-3、Python 2.7 上。当我在 Mac OS X 10.8、Python 2.7.2 上尝试这个时,这个问题没有发生。

如何使 SearchCtrl 中的文本始终为黑色?

4

1 回答 1

2

wxWidgets 2.8.12. _

当文本匹配提示文本(控件为空时显示的灰色文本)时,控件只会在获得焦点时将文本颜色设置为黑色。

要在不升级到 never 版本的情况下解决此问题,您必须在更改其文本之前聚焦控件:

wnd = self.FindFocus()   # get currently focused window
self.sc.SetFocus()       # trigger the color update (if needed)
self.sc.SetValue(value)
if wnd: wnd.SetFocus()   # restore previous focus
else: self.SetFocus()    # set focus to frame if none was set

要从 wxSearchCtrl 中删除文本并恢复灰色提示文本,只需简单调用即可Clear()(无论如何在 2.8.12 中)。

该错误已在最新的开发版本 ( 2.9.4) 中修复。但是,清除文本不会恢复提示文本。

之后OS X 10.3,将使用本机搜索控件,它不会表现出这种行为。

于 2012-12-09T18:15:14.390 回答