วิธีแปลงการป้อนตัวอักษรใน wx.TextCtrl เป็นตัวพิมพ์ใหญ่ทั้งหมดได้อย่างไร

ฉันกำลังพยายามเขียนเครื่องมือตรวจสอบความถูกต้องตัวแรกของฉันสำหรับ wx.TextCtrl ตาม การตอบสนองต่อคำถามอื่นใน SO ซึ่งควรทำดังต่อไปนี้:

ควรพิมพ์ตัวอักษรทั้งหมดเป็นตัวอักษรพิมพ์ใหญ่ และช่องข้อความควรมีเฉพาะตัวอักษรพิมพ์ใหญ่และตัวเลขเท่านั้น

อย่างไรก็ตาม ความพยายามของฉันล้มเหลวในสองประเด็น:

  • เมื่อฉันเปลี่ยนเทมเพลต (นำมาจากการตอบกลับที่เชื่อมโยง) ไม่มีอะไรถูกเพิ่มลงในช่องข้อความ

  • ฉันไม่สามารถเปลี่ยนอักษรตัวเล็กเป็นตัวพิมพ์ใหญ่ได้

นี่คือความพยายามของฉัน:

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()

person Henrik    schedule 08.04.2012    source แหล่งที่มา


คำตอบ (2)


Demo Frame ของคุณมีปัญหากับโครงสร้างแผนผังวิดเจ็ต 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()

ในด้านเครื่องมือตรวจสอบ คุณไม่ได้ส่งจดหมายของคุณไปที่ 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() สำหรับแต่ละเหตุการณ์ถ่าน ในกรณีของคุณ การมีตัวควบคุมเพียงตัวเดียวโดยใช้เครื่องมือตรวจสอบความถูกต้อง คุณสามารถกำหนด self.object ได้เพียงครั้งเดียวในการเริ่มต้นเครื่องมือตรวจสอบความถูกต้อง

person joaquin    schedule 08.04.2012
comment
ขอบคุณสำหรับการตอบกลับของคุณ ในที่สุดฉันก็พบว่าฉันไม่ใช่ฟังก์ชั่นตรวจสอบความถูกต้อง แต่เป็นตัวจัดการเหตุการณ์ตามที่คุณดูเหมือนจะบอกเป็นนัยเช่นกัน ดูคำตอบของฉันเองที่ใช้สิ่งนี้ - person Henrik; 12.04.2012

ที่จริงแล้วความยุ่งเหยิงทั้งหมดกับฟังก์ชั่นการตรวจสอบนั้นไม่จำเป็น คุณเพียงแค่ต้องมีตัวจัดการเหตุการณ์ (โปรดทราบว่ามันถูกเขียนอย่างเลอะเทอะและฮาร์ดโค้ดไปยังวัตถุ 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()
person Henrik    schedule 12.04.2012
comment
คุณควรเลือกคำตอบที่ตอบคำถามและข้อกำหนดที่คุณโพสต์ ไม่ใช่สิ่งที่คุณคิดในภายหลัง ไม่ว่าในกรณีใด คำตอบของคุณไม่ได้เป็นไปตามข้อกำหนดที่คุณโพสต์ไว้ ประการแรก จะไม่ตรวจสอบสิ่งใด ๆ เพียงแปลงเป็นตัวพิมพ์ใหญ่ที่สามารถแปลงได้ และประการที่สอง คำตอบไม่สอดคล้องกับบรรทัดที่คุณเน้นสี ช่องข้อความควรมีเฉพาะตัวพิมพ์ใหญ่และตัวเลขเท่านั้น . ดังนั้นฉันขอแนะนำให้คุณลงคะแนนอัตโนมัติด้วยตัวเอง :-) - person joaquin; 12.04.2012
comment
บางทีคำถามของฉันอาจไม่ถูกต้อง จริงๆ แล้วฉันไม่ต้องการเครื่องมือตรวจสอบความถูกต้อง ฉันแค่อยากให้ตัวอักษรทั้งหมดเป็นตัวพิมพ์ใหญ่ และคุณพูดถูก ไม่มีการทิ้งตัวเลขหรืออักขระที่ไม่ใช่ตัวเลข อย่างไรก็ตาม นี่คือสิ่งที่ฉันต้องการทำให้สำเร็จ อย่างน้อยมันก็ตอบคำถามตามตัวอักษร (เช่น พาดหัวข่าว) ฉันไม่ต้องการที่จะหยาบคายและซาบซึ้งกับคำตอบของคุณจริงๆ แต่นี่คือคำตอบที่ฉันพบและโพสต์และยอมรับว่าเป็นข้อมูลอ้างอิง (และไม่ได้รับคะแนนใด ๆ จากมัน) โอเคสำหรับคุณ? - person Henrik; 12.04.2012