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に入力してEnterキーを押すと、scの黒いテキストですべてOKになります。これで、テキストボックスtcを入力して、Enterキーを押すと、scのテキストはまだ黒になります。

  • ただし、検索ボックスscに入力してEnterキーを押すと、scのテキストが灰色になります。その時点から、tcと入力してEnterキーを押すと、scのテキストは常に灰色になります。

注:入力を開始する前に、[リセット]ボタンを押してレイアウトをリセットできます。この問題は、Linux RedHat 4.5.1-3、Python2.7で発生しました。Mac OS X 10.8、Python 2.7.2でこれを試したところ、この問題は発生しませんでした。

SearchCtrlのテキストを常に黒にするにはどうすればよいですか?

4

1 に答える 1

2

これはのバグですwxWidgets 2.8.12

コントロールは、テキストがヒントテキスト(コントロールが空のときに表示される灰色のテキスト)と一致しているときにフォーカスを受け取ったときにのみ、テキストの色を黒に設定します。

決してバージョンにアップグレードせずにこれを修正するには、テキストを変更する前にコントロールに焦点を合わせる必要があります。

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 に答える