Я работаю над простой программой, которая собирает и проверяет пользовательский ввод. В дополнение к отображению
окно сообщения, если введенные пользователем данные не пройдены, я также хотел бы добавить приглашение
просто справа от поля ввода, сообщающего пользователю, какой тип данных требуется. Для этого я создал однорядный FlexGridSizer, состоящий из следующего:
[(wx.StaticText, «Имя»), (wx.TextCtrl, «пользовательские данные здесь»), (wx.StaticText, «Руководство по вводу»)]
При инициализации виджет «Руководство по вводу» скрыт. Если пользователь не может ввести что-либо в указанное поле, а затем нажимает кнопку ОК, я хочу, чтобы произошло три вещи
- Поле меняет цвет, чтобы предупредить пользователя о проблеме
- Виджет "Руководство по вводу" (третий в приведенном выше ряду) становится видимым
- Размер DialogBox автоматически изменяется, чтобы учесть видимый виджет
Пока что я могу только заставить (1) работать и ищу помощи с (2) и (3).
import wx
class Not_Empty(wx.PyValidator):
def __init__(self):
wx.PyValidator.__init__(self)
def Clone(self):
return Not_Empty()
################################################################################
def Validate(self, win):
""""""
evt_location = self.GetWindow()
val = evt_location.GetValue()
if val == "":
evt_location.SetBackgroundColour(wx.Color(250,200,230))
MyDialog().nameWarning_ST.Show(True)
return False
else:
return True
################################################################################
def TransferToWindow(self):
return True
def TransferFromWindow(self):
return True
class MyDialog(wx.Dialog):
def __init__(self):
wx.Dialog.__init__(self, parent=None, id=-1, title="Getting Input", style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
# Create field labels
name = wx.StaticText(self, -1, "Name")
# Create user-input widgets
name_TC = wx.TextCtrl(self, validator=Not_Empty())
# Create and hide warning boxes
self.nameWarning_ST = wx.StaticText(self, label="Field cannot be left empty", name="emptyAlert")
# to see what I want the dialog to look like AFTER the user has entered an
# empty string change 'False' to 'True' in the line below.
self.nameWarning_ST.Show(False)
# Create accept/cancel buttons
btns = self.CreateButtonSizer(flags=wx.OK|wx.CANCEL)
self.mainSizer = wx.BoxSizer(wx.VERTICAL)
fgs = wx.FlexGridSizer(cols = 3, rows = 1)
fgs.AddMany([(name, -1, wx.ALL, 5), (name_TC, -1, wx.ALL, 5), (self.nameWarning_ST, -1, wx.ALL, 5)])
self.mainSizer.AddMany([(fgs, 1, wx.ALL, 0), (btns, 1, wx.ALL|wx.EXPAND, 5)])
self.SetSizer(self.mainSizer)
self.mainSizer.Fit(self)
if __name__ == '__main__':
app = wx.App()
dlg = MyDialog()
dlg.Center()
dlg.ShowModal()
dlg.Destroy()
app.MainLoop()