#! /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仍然是黑色
注意:在开始输入之前,您可以通过按“重置”按钮重置布局。问题发生在Linux RedHat 4.5.1-3,Python 2.7上。当我在Mac OS X 10.8,Python 2.7.2上尝试这个时,这个问题没有发生。
如何使SearchCtrl中的文本始终为黑色?
答案 0 :(得分:2)
这是wxWidgets 2.8.12
中的bug。
控件只会在文本与提示文本(控件为空时显示的灰色文本)匹配时,将文本颜色设置为黑色。
要在不升级到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
及更高版本上,使用本机搜索控件,但不会出现此行为。