Я создаю графический интерфейс на основе 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()
спасибо.
Я не знаю каких-либо встроенных классов, чтобы позаботиться об этом, но вы должны быть способны поймать события щелчка мыши, чтобы сделать это сами. Это может помочь: http://wxpython-users.1045709.n5.be/ru/is-it-possible-detect-mouse-click-in-TextCtrl-td2358623.html – Lukeclh
@ Lukeclh благодарит, вот и все. Мне было непонятно, когда читаете документацию (как новичок с графическими интерфейсами), что все события Windows доступны для всех производных классов (поскольку TextCtrl получен из Windows). См. Сообщение для окончательных изменений. – jpf