【问题标题】:wxPython TextCtrl transform to UPPERCASEwxPython TextCtrl 转换为大写
【发布时间】:2010-11-17 12:51:52
【问题描述】:

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

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

【问题讨论】:

    标签: fonts wxpython uppercase textctrl


    【解决方案1】:

    检查此解决方案。

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

    【讨论】:

      【解决方案2】:

      试试这个。

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

      【讨论】:

      • 非常好。我考虑过改变文本选择,但我认为它可能有点慢,事实并非如此。无论如何打字的人都不会注意到..谢谢你,这非常酷。实际上,出于我的目的,将控件子类化为我提供了更多控制它的想法,再次感谢您。
      • 应该使用 ChangeValue 而不是 SetValue 以避免递归错误。 (SetValue 再次生成 EVT_TEXT 事件。)我已经编辑了代码。我在 iMac 上没有注意到,但在 Windows 上却注意到了。
      • 你知道..我觉得我应该能够自己解决这个问题..但我似乎找不到正确的方法。我希望能够添加更改其字体并保持相同样式的能力,它可以正常工作,直到它通过 ontext upper() 例程。之后我尝试设置字体,结果非常奇怪。有任何想法吗?我已经研究了一段时间
      • 您想在创建控件时即时更改字体还是只更改一次?
      • 只需一次,这样在框中输入的任何内容都会被适当地设置样式。 SetDefaultFont 不起作用.. 它适用于数字,一旦文本穿过上部,它就会回到默认的常规文本。我没有做任何工作..我现在正在 wx 基础文件中挖掘,看看是否可以找到文本 ctrl 的内容的副本..
      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2015-04-02
      • 2011-07-12
      • 1970-01-01
      相关资源
      最近更新 更多