wxPython文本字段输入特殊效果,包括文本输入事件和单击文本字段事件内部

时间:2014-09-06 16:45:36

标签: user-interface wxpython

我正在创建一个基于wxPython的GUI(我第一次创建GUI的经验)。 GUI的几个元素是文本输入字段,用户可以在文本字段中输入数据(例如TextCtrl)。

我试图在文本输入字段中创建一个共同的效果,在数据输入文本字段之前,有一个默认的指示,应该在文本字段中放置什么(例如"输入此处的数据")在输入任何文本之前呈灰色显示。如果该字段没有用户输入,我希望此默认指示再次显示。

这类事物的一个很好的例子是" Title" stackoverflow问题输入表单的字段,表示"您的编程问题是什么?要具体。"虽然,在这种情况下,还有另一种效果,当我在文本字段内单击时,文本变为浅灰色,只有在我输入某事后才会消失。

如果TextCtrl能够这样做,怎么做?我试过这样做,但我没有成功。我不想通过例子证明我是如何不成功的,而是想问一下如何做到这一点。

对于这些类型的效果,我是否应该使用除TextCtrl之外的类?

在下面的代码中,我试图只传达必要的部分。我认为代码可以工作。

import wx

class FormTab(wx.Panel):

  def __init__(self, *args, **kwargs):
    super(FormTab, self).__init__(*args, **kwargs)
    self.createControls()
    self.bindEvents()
    self.doLayout()

  def createControls(self):
    self.exeTextCtrl = wx.TextCtrl(self, value="Executable")
    font=wx.Font(8,wx.DEFAULT,wx.ITALIC,wx.NORMAL)
    self.exeTextCtrl.SetFont(font)

  def bindEvents(self):
    for control, event, handler in \
      [(self.exeTextCtrl, wx.EVT_LEFT_DOWN, self.onExeReady),
       (self.exeTextCtrl, wx.EVT_TEXT, self.onExeEntered)]:
      control.Bind(event, handler)

  def onExeReady(self, event):
    self.exeTextCtrl.SetValue('')
    font=wx.Font(8,wx.DEFAULT,wx.NORMAL,wx.NORMAL)
    self.exeTextCtrl.SetFont(font)
    event.Skip()

  def onExeEntered(self, event):
    exclass.exe=event.GetString()

  def doLayout(self):
    raise NotImplementedError # done in parent class

class FormTabLayout(FormTab):
  def doLayout(self):
    boxSizer = wx.BoxSizer(orient=wx.HORIZONTAL)
    # A GridSizer will contain the other controls:
    gridSizer = wx.FlexGridSizer(rows=12, cols=1, vgap=10, hgap=10)
    expandOption = dict(flag=wx.EXPAND)
    for control, options in \
            [(self.exeTextCtrl, expandOption)]:
        gridSizer.Add(control, **options)

    for control, options in \
            [(gridSizer, dict(border=5, flag=wx.ALL))]:
        boxSizer.Add(control, **options)

    self.SetSizerAndFit(boxSizer)


class Exclas():
  def __init__(self):
    self.exe=""

class FrameWithForms(wx.Frame):
  def __init__(self, *args, **kwargs):
    super(FrameWithForms, self).__init__(*args, **kwargs)
    notebook = wx.Notebook(self)
    self.form1 = FormTabLayout(notebook)
    notebook.AddPage(self.form1, 'Options') # tab
    self.SetClientSize(notebook.GetBestSize())

if __name__=='__main__':
  exclass=Exclas()
  app = wx.App(redirect=True, filename='mylog.txt')
  frame = FrameWithForms(None, title='Example GUI')
  frame.Show()
  app.MainLoop()

谢谢。

1 个答案:

答案 0 :(得分:2)

你可以使用一个wx.SearchCtrl,将SearchButton,CancelButton等设置为不显示,并使用SetDescriptiveText方法设置默认文本。

搜索控件是带有附加功能的wx.TextCtrl。