Fonts wxPython TextCtrl转换为大写

Fonts wxPython TextCtrl转换为大写,fonts,wxpython,uppercase,textctrl,Fonts,Wxpython,Uppercase,Textctrl,我正在寻找一种将输入textctrl字段的文本转换为大写的方法。我尝试使用验证器,并使用“ord”将key event对象的值转换为大写字母char值,但是我找不到任何“set”方法。我可以直接访问事件类变量,因为python中的类变量从来都不是真正私有的,但是我很难找到我需要的确切信息 无论如何,这似乎是一个过于复杂的方法。还有其他人有什么建议吗。我错过了什么明显的东西吗?试试这个 import wx class UpperTextCtrl(wx.TextCtrl): def __i

我正在寻找一种将输入textctrl字段的文本转换为大写的方法。我尝试使用验证器,并使用“ord”将key event对象的值转换为大写字母char值,但是我找不到任何“set”方法。我可以直接访问事件类变量,因为python中的类变量从来都不是真正私有的,但是我很难找到我需要的确切信息

无论如何,这似乎是一个过于复杂的方法。还有其他人有什么建议吗。我错过了什么明显的东西吗?

试试这个

import wx

class UpperTextCtrl(wx.TextCtrl):
    def __init__(self, *args, **kwargs):
        super(UpperTextCtrl, self).__init__(*args, **kwargs)
        self.Bind(wx.EVT_TEXT, self.on_text)
    def on_text(self, event):
        event.Skip()
        selection = self.GetSelection()
        value = self.GetValue().upper()
        self.ChangeValue(value)
        self.SetSelection(*selection)

class Frame(wx.Frame):
    def __init__(self):
        super(Frame, self).__init__(None, -1, 'Uppercase Text Control')
        panel = wx.Panel(self, -1)
        sizer = wx.BoxSizer(wx.VERTICAL)
        text = UpperTextCtrl(panel, -1, style=wx.TE_MULTILINE)

        # change the font
        font = text.GetFont()
        font.SetPointSize(12)
        text.SetFont(font)

        sizer.Add(text, 1, wx.EXPAND|wx.ALL, 10)
        panel.SetSizer(sizer)

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = Frame()
    frame.Show()
    app.MainLoop()
检查此解决方案

import wx
import string

class UpperTextCtrl(wx.TextCtrl):
    def __init__(self, *args, **kwargs):
        super(UpperTextCtrl, self).__init__(*args, **kwargs)
        self.Bind(wx.EVT_CHAR, self.on_char)
    def on_char(self, event):
        key=event.GetKeyCode()
        text_ctrl=event.GetEventObject()
        if chr(key) in string.letters:
            text_ctrl.AppendText(chr(key).upper())
            return
        event.Skip()

class Frame(wx.Frame):
    def __init__(self):
        super(Frame, self).__init__(None, -1, 'Uppercase Text Control')
        panel = wx.Panel(self, -1)
        sizer = wx.BoxSizer(wx.VERTICAL)
        text = UpperTextCtrl(panel, -1, style=wx.TE_MULTILINE)

        # change the font
        font = text.GetFont()
        font.SetPointSize(12)
        text.SetFont(font)

        sizer.Add(text, 1, wx.EXPAND|wx.ALL, 10)
        panel.SetSizer(sizer)

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = Frame()
    frame.Show()
    app.MainLoop()

很不错的。我考虑过修改文本选择,但我认为可能有点慢,事实并非如此。不管怎么说,对任何打字的人来说都不明显。。谢谢,这很酷。实际上,为了我的目的,子类化控件给了我很多控制它的想法,再次感谢你。应该使用ChangeValue而不是SetValue来避免递归错误。(SetValue再次生成EVT_文本事件。)我已经编辑了代码。我在iMac上没有注意到,但我在Windows上注意到了。你知道。。我觉得我应该能自己解决这个问题。。但我似乎找不到正确的方法。我希望能够将更改字体和保持相同样式的功能添加到这一功能中,直到完成ontext upper()例程为止,它都可以正常工作。我试着在那之后设置字体,结果很奇怪。有什么想法吗?我已经研究了一段时间了,你想在创建控件时动态地更改字体还是只更改一次?只更改一次,这样输入框中的任何内容都可以适当地设置样式。SetDefaultFont不起作用。。它对数字起作用,一旦文本通过上半部分,它就会返回默认的常规文本。我所做的一切都不管用。。我现在正在wx基本文件中挖掘,看看是否能找到文本ctrl的核心部分。。