wxPython:使用Show()和Hide()

wxPython:使用Show()和Hide(),python,wxpython,hide,show,validation,Python,Wxpython,Hide,Show,Validation,我正在开发一个简单的程序来收集和检查用户输入。除了展示 一个消息框如果用户提供的输入未通过检查,我还想添加一个提示 就在输入字段的右侧,告诉用户需要什么类型的数据。为了实现这一点,我创建了一个单行FlexGridSizer,由以下内容组成: [(wx.StaticText,“名称”),(wx.TextCtrl,“此处用户输入”),(wx.StaticText,“输入指南”)] 初始化时,“输入指南”小部件被隐藏。如果用户未能在提供的字段中输入任何内容,然后点击OK按钮,我希望发生三件事 字段更改

我正在开发一个简单的程序来收集和检查用户输入。除了展示 一个消息框如果用户提供的输入未通过检查,我还想添加一个提示 就在输入字段的右侧,告诉用户需要什么类型的数据。为了实现这一点,我创建了一个单行FlexGridSizer,由以下内容组成:

[(wx.StaticText,“名称”),(wx.TextCtrl,“此处用户输入”),(wx.StaticText,“输入指南”)]

初始化时,“输入指南”小部件被隐藏。如果用户未能在提供的字段中输入任何内容,然后点击OK按钮,我希望发生三件事

  • 字段更改颜色以提醒用户问题
  • “输入指南”小部件(上排第三个)将可见
  • 对话框会自动调整大小,以考虑现在可见的小部件
  • 到目前为止,我只能得到(1)工作,我正在寻求(2)和(3)方面的帮助



    编辑:对于新问题,我将使用pubsub来解决。将侦听器放在MyDialog类的init中,然后在另一个类中运行Validate方法时向其发布消息。在理论上将在MyDialog中创建的消息处理程序中,您需要在对话框上显示其他小部件并调用Layout()。这将使其适当调整大小

    您可以在此处阅读关于pubsub的教程:

    以下是原始问题:

    您的Validate方法从未启动过,因此我重新安排了Validate和OnChar方法,使其如下所示:

    import string
    def Validate(self, win):
        """
        Enter your code here...
        """
        return True
    
    
    def OnChar(self, event):
        txtObj = event.GetEventObject()
        txt = txtObj.GetValue()
        if txt == "": txt = '0'
        key = chr(event.GetKeyCode())
    
        if key in string.digits:
            if int(txt+str(key)) < 150:
                event.Skip()
            else:
                msg = "You have entered an age greater than 150!"
                wx.MessageBox(msg, "Improbable entry", style=wx.OK|wx.ICON_ERROR)
    
                # PROBLEM ARISES HERE
                # ===================
                MyDialog().ageWarning_ST.Show()
                MyDialog().mainSizer.Fit(MyDialog())
    
                return False
    
        key = event.GetKeyCode()
        if key in(wx.WXK_RETURN, wx.WXK_DELETE, wx.WXK_BACK):
            event.Skip()
    
        elif (chr(key)).isdigit():
            event.Skip()
        else:
            return
    
    导入字符串
    def验证(自我,赢):
    """
    在这里输入您的代码。。。
    """
    返回真值
    def OnChar(自身、事件):
    txtObj=event.GetEventObject()
    txt=txtObj.GetValue()
    如果txt==“”:txt='0'
    key=chr(event.GetKeyCode())
    如果输入string.digits:
    如果int(txt+str(键))<150:
    event.Skip()
    其他:
    msg=“您输入的年龄大于150岁!”
    MessageBox(消息,“不可能的输入”,style=wx.OK | wx.ICON_错误)
    #这里出现了问题
    # ===================
    MyDialog().ageWarning\u ST.Show()
    MyDialog().mainSizer.Fit(MyDialog())
    返回错误
    key=event.GetKeyCode()
    如果输入(wx.WXK_返回,wx.WXK_删除,wx.WXK_返回):
    event.Skip()
    elif(chr(key)).isdigit():
    event.Skip()
    其他:
    返回
    

    还请注意,我导入了字符串模块,使事情变得更简单。代码可能需要一些清理,但它在我的机器上工作。

    我已将您的代码添加到Mike中,但仍然无法获得我想要的行为。我正试图弄清楚的是StaticText小部件的.Show()和.Hide()。我编辑了我的问题,使代码更短,目标更明确。谢谢,保罗。非常感谢。现在按预期工作。下面得到迈克回应的代码有点像狗的早餐。我已经对它进行了大量的修改,以使我的目标更加清晰,尽管这确实意味着迈克的代码与新的和改进的问题无关
    import string
    def Validate(self, win):
        """
        Enter your code here...
        """
        return True
    
    
    def OnChar(self, event):
        txtObj = event.GetEventObject()
        txt = txtObj.GetValue()
        if txt == "": txt = '0'
        key = chr(event.GetKeyCode())
    
        if key in string.digits:
            if int(txt+str(key)) < 150:
                event.Skip()
            else:
                msg = "You have entered an age greater than 150!"
                wx.MessageBox(msg, "Improbable entry", style=wx.OK|wx.ICON_ERROR)
    
                # PROBLEM ARISES HERE
                # ===================
                MyDialog().ageWarning_ST.Show()
                MyDialog().mainSizer.Fit(MyDialog())
    
                return False
    
        key = event.GetKeyCode()
        if key in(wx.WXK_RETURN, wx.WXK_DELETE, wx.WXK_BACK):
            event.Skip()
    
        elif (chr(key)).isdigit():
            event.Skip()
        else:
            return