WX Python валидаторы в кадрах / панель не работает - PullRequest
0 голосов
/ 09 февраля 2020

Я довольно новичок в python и wx, я делаю приложение, и я сделал некоторые формы и прочее для рам и панели wx Python. Теперь я хочу проверить поля, поэтому мне нужно проверить TextCtrl, но у меня так много проблем.

Я много читал об этом, и мне ничего не помогает, кажется, все валидаторы быть разработанным для работы с wx.Dialogs, но не с рамками или панелями.

В документации по wx я нашел следующее утверждение, но не знаю, как его применить. Theres не учебник по inte rnet или что-то полезное, так что я весьма разочарован, любая помощь будет признательна!.

"" Если вы используете окно или панель вместо диалога, вы будете перед тем, как показывать окно, нужно явно вызвать 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

1 Ответ

0 голосов
/ 10 февраля 2020

Валидаторы используются реализациями по умолчанию функций TransferDataToWindow(), Validate() и TransferDataFromWindow(), которые вызываются автоматически для модальных диалоговых окон, когда диалоговое окно отображается и когда оно закрывается. Вы все еще можете использовать валидаторы с другими типами windows, но в этом случае вам нужно самим вызывать эти функции. Для первого достаточно просто позвонить самому после завершения построения вашего фрейма, но вы также можете позвонить InitDialog(), что сделает это косвенно для вас (хотя я действительно не понимаю, зачем вам это делать). Для последних двух вам нужно вызывать их вручную каждый раз, когда пользователь «принимает» выбор, например, обычно, когда нажимается какая-то кнопка, и логика c здесь сначала вызывает Validate(), а затем, если возвращается true вызовите TransferDataFromWindow(), чтобы фактически сохранить данные, введенные пользователем в переменные вашей программы.

Конечно, если вам не нужно ничего передавать (вы не делаете этого в своем примере), вы можно просто позвонить Validate() и забыть о 2 других функциях.

...