如何在wxpyctrl中使wxpyctrl中的文本不灰显?

时间:2012-12-06 23:31:30

标签: linux text wxpython

#! /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然后按Enter键,则sc中的文本始终为灰色。

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

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

1 个答案:

答案 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及更高版本上,使用本机搜索控件,但不会出现此行为。