Fonts wxPython TextCtrl转换为大写
我正在寻找一种将输入textctrl字段的文本转换为大写的方法。我尝试使用验证器,并使用“ord”将key event对象的值转换为大写字母char值,但是我找不到任何“set”方法。我可以直接访问事件类变量,因为python中的类变量从来都不是真正私有的,但是我很难找到我需要的确切信息 无论如何,这似乎是一个过于复杂的方法。还有其他人有什么建议吗。我错过了什么明显的东西吗?试试这个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
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的核心部分。。