0

SOに関する別の質問へのこの回答にwx.TextCtrl基づいて、次のことを行う必要がある最初のバリデーターを作成しようとしています:

すべての文字は大文字で印刷し、テキスト フィールドには大文字と数字のみを含める必要があります。

ただし、私の試みは次の 2 つの点で失敗します。

  • テンプレートを変更すると (リンクされた応答から取得)、テキスト フィールドに何も追加されません。

  • 小文字を大文字に変更できません。

これが私の試みです:

import wx
import string

########################################################################
class CharValidator(wx.PyValidator):
    ''' Validates data as it is entered into the text controls. '''

    #----------------------------------------------------------------------
    def __init__(self, flag):
        wx.PyValidator.__init__(self)
        self.flag = flag
        self.Bind(wx.EVT_CHAR, self.OnChar)

    #----------------------------------------------------------------------
    def Clone(self):
        '''Required Validator method'''
        return CharValidator(self.flag)

    #----------------------------------------------------------------------
    def Validate(self, win):
        return True

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

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

    #----------------------------------------------------------------------
    def OnChar(self, event):
        keycode = int(event.GetKeyCode())
        if keycode < 256:
            if keycode > 96 & keycode < 123:
                keycode = keycode - 32
            #print keycode
            key = chr(keycode)
            #print key
            return
        event.Skip()

########################################################################
class ValidationDemo(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "Text Validation Tutorial")

        panel = wx.Panel(self)
        textOne = wx.TextCtrl(panel, validator=CharValidator('no-alpha'))

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(textOne, 0, wx.ALL, 5)
        panel.SetSizer(sizer)

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = ValidationDemo()
    frame.Show()
    app.MainLoop()
4

2 に答える 2

0

実際、バリデーション関数のすべての混乱は不要です。イベントハンドラーが必要なだけです (textOne入力オブジェクトを取得する代わりに、記述が雑で、特定のオブジェクトにハードコードされていることに注意してください)。

さらに、次のように移動すると良いようですInsertionPoint

import wx

class ValidationDemo(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "Text Validation Tutorial")

        panel = wx.Panel(self)
        self.textOne = wx.TextCtrl(panel)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.textOne, 0, wx.ALL, 5)
        panel.SetSizer(sizer)

        self.Bind(wx.EVT_TEXT, self.OnTextType, self.textOne)

    def OnTextType(self, event):
        self.textOne.ChangeValue(unicode.upper(self.textOne.GetValue()))
        self.textOne.SetInsertionPointEnd()


# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = ValidationDemo()
    frame.Show()
    app.MainLoop()
于 2012-04-12T10:18:37.123 に答える
0

デモ フレームの wxPython ウィジェット ツリー構造に問題があります。これにより、テキスト コントロールに次のように書き込むことができます。

class ValidationDemo(wx.Frame):
    """"""
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "Text Validation Tutorial")

        textOne = wx.TextCtrl(self, validator=CharValidator('no-alpha'))

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(textOne, 1, wx.ALL| wx.EXPAND, 5)
        self.SetSizer(sizer)
        self.Fit()

Validator 側では、一度計算された文字を textcontrol に送信していません。さらに悪いことに、あなたはいつも戻ってきてイベントを殺しています。

これは機能します(コメントで説明します):

def OnChar(self, event):
    keycode = int(event.GetKeyCode())
    #
    # get the widget where the text entry takes place
    object = self.GetWindow()
    #
    # for upper-case and for numbers, let the event go
    if (58 > keycode > 47) or ( 91 > keycode > 64):
        event.Skip()
    #
    # for lower-case, convert to upper and write it yourself
    elif 123 > keycode > 96:
        keycode = keycode - 32
        key = chr(keycode)
        object.write(key)

self.GetWindow()char イベントごとに呼び出していることに注意してください。あなたの場合、バリデーターを使用してコントロールを1つだけ持つと、self.objectバリデーターの初期化時に1回だけ定義できます。

于 2012-04-08T15:55:21.560 に答える