<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FProgramowanie_dla_Fizyk%C3%B3w_Medycznych%3AValidatory</id>
	<title>TI/Programowanie dla Fizyków Medycznych:Validatory - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FProgramowanie_dla_Fizyk%C3%B3w_Medycznych%3AValidatory"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych:Validatory&amp;action=history"/>
	<updated>2026-05-03T23:33:27Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych:Validatory&amp;diff=3327&amp;oldid=prev</id>
		<title>Tgubiec o 11:28, 4 cze 2015</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych:Validatory&amp;diff=3327&amp;oldid=prev"/>
		<updated>2015-06-04T11:28:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 11:28, 4 cze 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Linia 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;==Validatory==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Walidatory służą do sprawdzania poprawności danych wpisanych przez użytkownika. Jak pamiętamy z rozdziału prezentującego widgety w wielu przypadkach w konstruktorze był parametr valiadator. Aby napisać własny walidator należy stworzyć klasę dziedziczącą po wx.PyValidator, musi ona mieć metodę Clone zwracającą nowy obiekt walidatora, metodę Validate zwracającą True gdy test się powiódł i False gdy dane nie są poprawne i dwie metody TransferTo(From)Window obsługujące przesyłanie danych do i z okna które wywołało okno zawierające walidowaną kontrolkę. Najłatwiej walidacji używa się w przypadku dialogów, gdyż jest ona automatycznie odpalana przy kliknięciu przycisku o id równym wx.ID_OK, oto przykład:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Walidatory służą do sprawdzania poprawności danych wpisanych przez użytkownika. Jak pamiętamy z rozdziału prezentującego widgety w wielu przypadkach w konstruktorze był parametr valiadator. Aby napisać własny walidator należy stworzyć klasę dziedziczącą po wx.PyValidator, musi ona mieć metodę Clone zwracającą nowy obiekt walidatora, metodę Validate zwracającą True gdy test się powiódł i False gdy dane nie są poprawne i dwie metody TransferTo(From)Window obsługujące przesyłanie danych do i z okna które wywołało okno zawierające walidowaną kontrolkę. Najłatwiej walidacji używa się w przypadku dialogów, gdyż jest ona automatycznie odpalana przy kliknięciu przycisku o id równym wx.ID_OK, oto przykład:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang='python'&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang='python'&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l185&quot; &gt;Linia 185:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 186:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;app.MainLoop()&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;app.MainLoop()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&amp;quot;Programowanie dla Fizyków Medycznych&amp;quot;]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Tgubiec</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych:Validatory&amp;diff=2002&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;Walidatory służą do sprawdzania poprawności danych wpisanych przez użytkownika. Jak pamiętamy z rozdziału prezentującego widgety w wielu przypadkach w konstrukto...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych:Validatory&amp;diff=2002&amp;oldid=prev"/>
		<updated>2015-05-23T14:26:34Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;Walidatory służą do sprawdzania poprawności danych wpisanych przez użytkownika. Jak pamiętamy z rozdziału prezentującego widgety w wielu przypadkach w konstrukto...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Walidatory służą do sprawdzania poprawności danych wpisanych przez użytkownika. Jak pamiętamy z rozdziału prezentującego widgety w wielu przypadkach w konstruktorze był parametr valiadator. Aby napisać własny walidator należy stworzyć klasę dziedziczącą po wx.PyValidator, musi ona mieć metodę Clone zwracającą nowy obiekt walidatora, metodę Validate zwracającą True gdy test się powiódł i False gdy dane nie są poprawne i dwie metody TransferTo(From)Window obsługujące przesyłanie danych do i z okna które wywołało okno zawierające walidowaną kontrolkę. Najłatwiej walidacji używa się w przypadku dialogów, gdyż jest ona automatycznie odpalana przy kliknięciu przycisku o id równym wx.ID_OK, oto przykład:&lt;br /&gt;
&amp;lt;source lang='python'&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import wx&lt;br /&gt;
&lt;br /&gt;
class LessThenIntValidator(wx.PyValidator):&lt;br /&gt;
    def __init__(self, a, data, key):&lt;br /&gt;
        super(LessThenIntValidator, self).__init__()&lt;br /&gt;
        self.a = a&lt;br /&gt;
        self.data = data&lt;br /&gt;
        self.key = key&lt;br /&gt;
    def Clone(self):&lt;br /&gt;
        return LessThenIntValidator(self.a, self.data, self.key)&lt;br /&gt;
    def Validate(self, win):&lt;br /&gt;
        textCtrl = self.GetWindow()&lt;br /&gt;
        text = textCtrl.GetValue()&lt;br /&gt;
        try:&lt;br /&gt;
            if int(text) &amp;gt; self.a:&lt;br /&gt;
                raise Exception&lt;br /&gt;
            textCtrl.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))&lt;br /&gt;
            textCtrl.Refresh()&lt;br /&gt;
            return True&lt;br /&gt;
        except:&lt;br /&gt;
            wx.MessageBox(&amp;quot;Pole musi zawierać liczbę całkowitą mniejszą od &amp;quot; + str(self.a), &amp;quot;Error&amp;quot;)&lt;br /&gt;
            textCtrl.SetBackgroundColour(&amp;quot;pink&amp;quot;)&lt;br /&gt;
            textCtrl.SetFocus()&lt;br /&gt;
            textCtrl.Refresh()&lt;br /&gt;
            return False&lt;br /&gt;
    def TransferToWindow(self):&lt;br /&gt;
        textCtrl = self.GetWindow()&lt;br /&gt;
        textCtrl.SetValue(self.data[self.key])&lt;br /&gt;
        return True&lt;br /&gt;
    def TransferFromWindow(self):&lt;br /&gt;
        self.data[self.key] = self.GetWindow().GetValue()&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
class MyDialog(wx.Dialog):&lt;br /&gt;
    def __init__(self, data, key, *a, **b):&lt;br /&gt;
        super(MyDialog, self).__init__(*a, **b)&lt;br /&gt;
        txt = wx.TextCtrl(self, validator = LessThenIntValidator(10, data, key))&lt;br /&gt;
        btn = wx.Button(self, id = wx.ID_OK, label = 'OK')&lt;br /&gt;
        vBox = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;
        vBox.Add(txt)&lt;br /&gt;
        vBox.Add(btn)&lt;br /&gt;
        self.SetSizer(vBox)&lt;br /&gt;
        self.Show()&lt;br /&gt;
&lt;br /&gt;
class MyFrame(wx.Frame):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        super(MyFrame, self).__init__(None, size = (200, 200))&lt;br /&gt;
        self.InitUI()&lt;br /&gt;
        self.Show()&lt;br /&gt;
    def InitUI(self):&lt;br /&gt;
        self.key = 'a'&lt;br /&gt;
        self.data = {self.key : ''}&lt;br /&gt;
        panel = wx.Panel(self)&lt;br /&gt;
        sizer = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;
        self.txt = wx.TextCtrl(panel)&lt;br /&gt;
        btn = wx.Button(panel, label = u'pokaż dialog')&lt;br /&gt;
        sizer.Add(self.txt, proportion = 1, flag = wx.EXPAND)&lt;br /&gt;
        sizer.Add(btn, proportion = 1, flag = wx.EXPAND)&lt;br /&gt;
        panel.SetSizer(sizer)&lt;br /&gt;
        self.Bind(wx.EVT_BUTTON, self.OnButton, btn)&lt;br /&gt;
    def OnButton(self, evt):&lt;br /&gt;
        self.data[self.key] = self.txt.GetValue()&lt;br /&gt;
        myDialog = MyDialog(self.data, self.key, None)&lt;br /&gt;
        myDialog.ShowModal()&lt;br /&gt;
        myDialog.Destroy()&lt;br /&gt;
        self.txt.SetValue(self.data[self.key])&lt;br /&gt;
&lt;br /&gt;
app = wx.App()&lt;br /&gt;
MyFrame()&lt;br /&gt;
app.MainLoop()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Trochę trudniej jest gdy chcemy poddać walidacji obiekt klasy wx.Frame - walidację wtedy trzeba wywołać ręcznie i dodać ramce styl wx.WS_EX_VALIDATE_RECURSIVELY:&lt;br /&gt;
&amp;lt;source lang='python'&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import wx&lt;br /&gt;
&lt;br /&gt;
class IntValidator(wx.PyValidator):&lt;br /&gt;
    def __init__(self, a):&lt;br /&gt;
        super(IntValidator, self).__init__()&lt;br /&gt;
        self.a = a&lt;br /&gt;
    def Clone(self):&lt;br /&gt;
        return IntValidator(self.a)&lt;br /&gt;
    def Validate(self, win):&lt;br /&gt;
        textCtrl = self.GetWindow()&lt;br /&gt;
        text = textCtrl.GetValue()&lt;br /&gt;
        try:&lt;br /&gt;
            if int(text) &amp;lt; self.a:&lt;br /&gt;
                raise Exception&lt;br /&gt;
            textCtrl.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))&lt;br /&gt;
            textCtrl.Refresh()&lt;br /&gt;
            return True&lt;br /&gt;
        except:&lt;br /&gt;
            wx.MessageBox(&amp;quot;Pole musi zawierać liczbę całkowitą większą od &amp;quot; + str(self.a), &amp;quot;Error&amp;quot;)&lt;br /&gt;
            textCtrl.SetBackgroundColour(&amp;quot;pink&amp;quot;)&lt;br /&gt;
            textCtrl.SetFocus()&lt;br /&gt;
            textCtrl.Refresh()&lt;br /&gt;
            return False&lt;br /&gt;
    def TransferToWindow(self):&lt;br /&gt;
        return True&lt;br /&gt;
    def TransferFromWindow(self):&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
class MyPanel(wx.Panel):&lt;br /&gt;
    def __init__(self, *a, **b):&lt;br /&gt;
        super(MyPanel, self).__init__(*a, **b)&lt;br /&gt;
        txt = wx.TextCtrl(self, validator = IntValidator(10))&lt;br /&gt;
        self.btn = wx.Button(self, id = wx.ID_OK, label = 'OK')&lt;br /&gt;
        vBox = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;
        vBox.Add(txt)&lt;br /&gt;
        vBox.Add(self.btn)&lt;br /&gt;
        self.SetSizer(vBox)&lt;br /&gt;
        &lt;br /&gt;
class MyFrame(wx.Frame):&lt;br /&gt;
    def __init__(self, *a, **b):&lt;br /&gt;
        super(MyFrame, self).__init__(*a, **b)&lt;br /&gt;
        myPanel = MyPanel(self)&lt;br /&gt;
        self.Show()&lt;br /&gt;
        self.Bind(wx.EVT_BUTTON, self.OnOK, myPanel.btn)&lt;br /&gt;
        self.SetExtraStyle(wx.WS_EX_VALIDATE_RECURSIVELY)&lt;br /&gt;
    def OnOK(self, evt):&lt;br /&gt;
        self.Validate()&lt;br /&gt;
app = wx.App()&lt;br /&gt;
MyFrame(None)&lt;br /&gt;
app.MainLoop()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Często chcielibyśmy móc walidować pola od razu po opuszczeni ich np tabem, można tego dokonać w następujący sposób (wyłapując na poziomie kontrolki event EVT_KILL_FOCUS), ale nie jest to najładniejsze rozwiązanie - zobacz co się dzieje gdy chcesz zamknąć okno przy pomocy przycisku x:&lt;br /&gt;
&amp;lt;source lang='python'&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import wx&lt;br /&gt;
&lt;br /&gt;
class IntValidator(wx.PyValidator):&lt;br /&gt;
    def __init__(self, a):&lt;br /&gt;
        super(IntValidator, self).__init__()&lt;br /&gt;
        self.a = a&lt;br /&gt;
    def Clone(self):&lt;br /&gt;
        return IntValidator(self.a)&lt;br /&gt;
    def Validate(self, win):&lt;br /&gt;
        textCtrl = self.GetWindow()&lt;br /&gt;
        text = textCtrl.GetValue()&lt;br /&gt;
        try:&lt;br /&gt;
            if int(text) &amp;lt; self.a:&lt;br /&gt;
                raise Exception&lt;br /&gt;
            textCtrl.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))&lt;br /&gt;
            textCtrl.Refresh()&lt;br /&gt;
            return True&lt;br /&gt;
        except:&lt;br /&gt;
            wx.MessageBox(&amp;quot;Pole musi zawierać liczbę całkowitą większą od &amp;quot; + str(self.a), &amp;quot;Error&amp;quot;)&lt;br /&gt;
            textCtrl.SetBackgroundColour(&amp;quot;pink&amp;quot;)&lt;br /&gt;
            textCtrl.SetFocus()&lt;br /&gt;
            textCtrl.Refresh()&lt;br /&gt;
            return False&lt;br /&gt;
    def TransferToWindow(self):&lt;br /&gt;
        return True&lt;br /&gt;
    def TransferFromWindow(self):&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
class MyTextCtrl(wx.TextCtrl):&lt;br /&gt;
    def __init__(self, *a, **b):&lt;br /&gt;
        super(MyTextCtrl, self).__init__(*a, **b)&lt;br /&gt;
        self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)&lt;br /&gt;
    def OnKillFocus(self, evt):&lt;br /&gt;
        self.GetValidator().Validate(self)&lt;br /&gt;
        &lt;br /&gt;
class MyPanel(wx.Panel):&lt;br /&gt;
    def __init__(self, *a, **b):&lt;br /&gt;
        super(MyPanel, self).__init__(*a, **b)&lt;br /&gt;
        txt = MyTextCtrl(self, validator = IntValidator(10))&lt;br /&gt;
        self.btn = wx.Button(self, id = wx.ID_OK, label = 'OK')&lt;br /&gt;
        vBox = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;
        vBox.Add(txt)&lt;br /&gt;
        vBox.Add(self.btn)&lt;br /&gt;
        self.SetSizer(vBox)&lt;br /&gt;
        &lt;br /&gt;
class MyFrame(wx.Frame):&lt;br /&gt;
    def __init__(self, *a, **b):&lt;br /&gt;
        super(MyFrame, self).__init__(*a, **b)&lt;br /&gt;
        myPanel = MyPanel(self)&lt;br /&gt;
        self.Show()&lt;br /&gt;
        &lt;br /&gt;
app = wx.App()&lt;br /&gt;
MyFrame(None)&lt;br /&gt;
app.MainLoop()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>