2009-08-06 5 views
2

나는 textctrl 필드에 입력 된 텍스트를 대문자로 변환하는 방법을 찾고있었습니다. 나는 유효성 검사기를 사용하고 'ord'를 사용하여 키 이벤트 객체의 값을 대문자 char 값으로 변환하려고 시도했지만 어떤 'set'메소드도 찾을 수 없었습니다. 나는 파이썬에서 클래스 변수가 실제로는 사적인 것이 아니기 때문에 직접 이벤트 클래스 변수에 접근 할 수 있을지도 모른다. 그러나 나는 그것을 할 필요가있는 정확한 정보를 찾는 데 어려움을 겪고있다.wxPython TextCtrl 대문자로 변환

어쨌든 이것은 지나치게 복잡한 접근법처럼 보입니다. 다른 누구도 제안 사항이 있습니까? 나는 명백한 것을 놓치고 있는가?

답변

3

시도해보십시오.

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

아주 좋습니다. 나는 텍스트 선택을 바꾸는 것을 고려했다. 그러나 나는 그것이 조금 느릴지도 모른다라고 생각했다, 그렇지 않다. 어쨌든 타자를 치는 사람에게는 눈에 띄지 않습니다. 아주 고맙습니다. 실제로 내 목적을 위해 컨트롤을 서브 클래 싱하면 제어 할 수있는 아이디어가 더 많아졌습니다. 다시 한 번 감사드립니다. –

+0

재귀 버그를 피하려면 SetValue 대신 ChangeValue를 사용해야합니다. (SetValue는 EVT_TEXT 이벤트를 다시 생성합니다.) 코드를 편집했습니다. 나는 아이맥에서 눈치 채지 못했지만 윈도우에서는 눈치 챘다. – FogleBird

+0

너도 알다시피. 나는 내 자신에 대해 이것을 알아낼 수 있어야한다고 생각한다. 그러나 나는 올바른 길을 찾지 못한다. 이 글꼴을 변경하고 동일한 스타일을 유지하는 기능을 추가 할 수 있기를 원할 때, ontext upper() 루틴을 통과 할 때까지 잘 작동합니다. 필자는 매우 특별한 결과로 글꼴을 설정하려고했습니다. 어떤 아이디어? 필자는 이것을 약간의 시간 동안 연구 해왔다. –

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() 
관련 문제