2014-09-06 4 views
1

Я создаю графический интерфейс на основе wxPython (мой первый опыт создания GUI). Несколько элементов графического интерфейса - это текстовые поля ввода, в которых пользователь может вводить данные в текстовое поле (например, TextCtrl).спецэффекты ввода текста текстового поля wxPython, включая событие ввода текста и щелчок внутри события текстового поля

Я пытаюсь создать общий эффект в полях ввода текста, где перед вводом данных в текстовое поле появляется стандартная индикация того, что должно быть помещено в текстовое поле (например, «Введите данные здесь») который неактивен до тех пор, пока не будет введен какой-либо текст. Если поле отсутствует для ввода пользователем, я бы хотел, чтобы эта индикация по умолчанию отображалась снова.

Отличный пример такого рода находится в поле «Заголовок» формы ввода вопросов в виде 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() 

спасибо.

+0

Я не знаю каких-либо встроенных классов, чтобы позаботиться об этом, но вы должны быть способны поймать события щелчка мыши, чтобы сделать это сами. Это может помочь: http://wxpython-users.1045709.n5.be/ru/is-it-possible-detect-mouse-click-in-TextCtrl-td2358623.html – Lukeclh

+1

@ Lukeclh благодарит, вот и все. Мне было непонятно, когда читаете документацию (как новичок с графическими интерфейсами), что все события Windows доступны для всех производных классов (поскольку TextCtrl получен из Windows). См. Сообщение для окончательных изменений. – jpf

ответ

2

Вы можете использовать wx.SearchCtrl с помощью параметра SearchButton, CancelButton, который не должен отображаться, и использовать метод SetDescriptiveText для установки вашего текста по умолчанию.

Элемент управления поиском - это wx.TextCtrl с добавленной функциональностью.

+0

То, что мне нужно. Спасибо. – jpf