wxPython验证器在框架/面板中不起作用

问题描述 投票:0回答:1

我是python和wx的新手,正在制作一个应用程序,并在wxPython槽形框架和面板上制作了一些表格和东西。现在,我想验证字段,因此我必须验证TextCtrl,但是我遇到了很多麻烦。

我已经阅读了很多关于此的内容,但对我来说却无济于事,所有验证器似乎都设计为可与wx.Dialogs一起使用,但不适用于框架或面板。

在wx文档中,我找到了以下语句,但是我不知道如何应用。那里没有互联网上的教程或其他有用的东西,所以我很沮丧,任何帮助将不胜感激!。

“”如果要使用窗口或面板而不是对话框,则需要在显示窗口之前显式调用wx.Window.InitDialog。“” https://wxpython.org/Phoenix/docs/html/validator_overview.html

我改编了用对话框制作的最相似的验证器示例,因为我改编成适用于框架,但不起作用。

import wx
###############################################################################

class CustomNumValidator(wx.Validator):
    """ Validator for entering custom low and high limits """
    print('creado')
    def __init__(self):
        super(CustomNumValidator, self).__init__()


    # --------------------------------------------------------------------------
    def Clone(self):
        """ """
        return CustomNumValidator()

    # --------------------------------------------------------------------------
    def Validate(self, win):
        """ """
        textCtrl = self.GetWindow()
        text = textCtrl.GetValue()
        print('pasando')
        if text.isdigit():
            return True
        else:
            wx.MessageBox("Please enter numbers only", "Invalid Input",
            wx.OK | wx.ICON_ERROR)
        return False

    # --------------------------------------------------------------------------
    def TransferToWindow(self):
        return True

    # --------------------------------------------------------------------------
    def TransferFromWindow(self):
        return True


class CustomNumbers(wx.Frame):
    """ Dialog for choosing custom numbers """
    def __init__(self, *args, **kwargs):
        super(CustomNumbers, self).__init__(*args, **kwargs)

        wx.Frame.__init__(self, None, wx.ID_ANY, "Software Legal")

        self.SetBackgroundColour("WHITE")
        self.widget_dict = {}

        self.initUI()
        self.SetSizerAndFit(self.main_sizer)

        self.Layout()
        self.Refresh()

    # --------------------------------------------------------------------------
    def initUI(self):
        """ """
        self.createSizer()
        self.createText()
        self.createInputBox()
        self.createButton()
        self.addSizerContent()

    # --------------------------------------------------------------------------
    def createSizer(self):
        self.main_sizer = wx.BoxSizer(wx.VERTICAL)

    # --------------------------------------------------------------------------
    def createText(self):
        """ """
        low_num_text = wx.StaticText(self, -1, "Low Number")
        high_num_text = wx.StaticText(self, -1, "High Number")

        self.widget_dict["low_num_text"] = low_num_text
        self.widget_dict["high_num_text"] = high_num_text

    # --------------------------------------------------------------------------
    def createInputBox(self):
        """ """
        low_input = wx.TextCtrl(self, validator=CustomNumValidator())
        high_input = wx.TextCtrl(self, validator=CustomNumValidator())
        self.widget_dict["low_input"] = low_input
        self.widget_dict["high_input"] = high_input

    # --------------------------------------------------------------------------
    def createButton(self):
        """ """
        ok_btn = wx.Button(self, wx.ID_OK, "Enter")
        cancel_btn = wx.Button(self, wx.ID_CANCEL, "Cancel")

        self.widget_dict["ok_btn"] = ok_btn
        self.widget_dict["cancel_btn"] = cancel_btn

    # --------------------------------------------------------------------------
    def addSizerContent(self):
        """ """
        top_sizer = wx.BoxSizer()
        top_sizer.Add(self.widget_dict["low_num_text"], 3, wx.ALL, 10)
        top_sizer.Add(self.widget_dict["low_input"], 7, wx.ALL ^ wx.RIGHT, 10)

        btm_sizer = wx.BoxSizer()
        btm_sizer.Add(self.widget_dict["high_num_text"], 3, wx.ALL, 10)
        btm_sizer.Add(self.widget_dict["high_input"], 7, wx.ALL, 10)

        btn_sizer = wx.BoxSizer()
        btn_sizer.Add(self.widget_dict["ok_btn"], 0, wx.CENTER | wx.ALL, 10)
        btn_sizer.Add(self.widget_dict["cancel_btn"], 0,
                      wx.CENTER | wx.ALL, 10)

        self.main_sizer.Add(top_sizer)
        self.main_sizer.Add(btm_sizer)
        self.main_sizer.Add(btn_sizer, 0, wx.CENTER | wx.ALL, 10)

    # --------------------------------------------------------------------------
    def getValues(self):
        """ """


###############################################################################


class MyApp(wx.App):
    def OnInit(self):
        self.frame= CustomNumbers()
        self.frame.Show()
        return True       

# Run the program     
app=MyApp()
app.MainLoop()
del app

原始工作代码是这个:http://www.pygopar.com/using-validators-from-wxpython

wxpython wxwidgets wxpython-phoenix wxtextctrl
1个回答
0
投票

Validators由TransferDataToWindow()Validate()TransferDataFromWindow()函数的默认实现使用,当模态对话框显示或关闭时,模态对话框会自动调用这些函数。您仍然可以将验证器与其他类型的窗口一起使用,但是在这种情况下,您需要自己调用这些函数。对于前者,在完成构造框架后就可以很容易地自己调用它,但是您也可以调用InitDialog(),它会间接为您完成操作(不过我真的不明白您为什么要这样做)。对于后两者,无论何时用户“接受”选择,您都需要手动调用它们。通常,当单击某些按钮并且此处的逻辑是先调用Validate(),然后返回true时,调用TransferDataFromWindow()来将用户输入的数据实际存储在程序变量中。

当然,如果您不需要传输任何内容(在您的示例中您无需这样做),您只需调用Validate()并忘记其他2个功能。

© www.soinside.com 2019 - 2024. All rights reserved.