是否可以限制 TextCtrl 仅在 wxPython 中接受数字?
题
我想要一个只接受数字的文本控件。(只是整数值,如 45 或 366)
做这个的最好方式是什么?
解决方案
IntCtrl
,Masked Edit Control
,和NumCtrl
都被设计来做到这此,具有不同水平的控制。结帐下“更多的Windows /控件”的WX演示,看看他们是如何工作的。
(或者,如果你不是很期待直接与原料TextCtrl这样做,我想你会想赶上EVT_CHAR事件,考验的人物,并调用evt.Skip(),如果它是允许的字符。)
其他提示
我不得不做类似的事情,检查字母数字代码。上EVT_CHAR尖端是正确的事:
class TestPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
self.entry = wx.TextCtrl(self, -1)
self.entry.Bind(wx.EVT_CHAR, self.handle_keypress)
def handle_keypress(self, event):
keycode = event.GetKeyCode()
if keycode < 255:
# valid ASCII
if chr(keycode).isalnum():
# Valid alphanumeric character
event.Skip()
你可以试试 IntCtrl
, EVT_CHAR
, ,或实现一个新的/现有的验证器(例如 内部验证器)。验证器可用于验证字段(在尝试验证对话框/面板上的多个内容时很有用),它们还可以与 EVT_CHAR 一起使用来限制字段中的输入。
至于其他的答案请注意,它可能与EVT_CHAR
处理程序来做到这一点。你要打电话event.Skip()
你想让通过人物,而不是把它叫做你想阻止的。一个细微差别是,你可能也想呼吁制表符event.Skip()
;压片触发EVT_CHAR
事件,如果你不叫event.Skip()
,你会有效地禁用TextCtrl
s之间标签穿越。
下面的示出了两个TextCtrl
s接受整数或十进制数最小的应用程序中,与工作标签遍历:
import wx
app = wx.App()
frame = wx.Frame(None, -1, 'simple.py')
panel = wx.Panel(frame)
text_ctrl_1 = wx.TextCtrl(panel, value='123')
text_ctrl_2 = wx.TextCtrl(panel, value='456', pos=(0, 30))
def block_non_numbers(event):
key_code = event.GetKeyCode()
# Allow ASCII numerics
if ord('0') <= key_code <= ord('9'):
event.Skip()
return
# Allow decimal points
if key_code == ord('.'):
event.Skip()
return
# Allow tabs, for tab navigation between TextCtrls
if key_code == ord('\t'):
event.Skip()
return
# Block everything else
return
text_ctrl_1.Bind(wx.EVT_CHAR, block_non_numbers)
text_ctrl_2.Bind(wx.EVT_CHAR, block_non_numbers)
frame.Show()
app.MainLoop()
NumCtrl有一些奇怪的怪癖给我。这是我试图创建一个基于EVT_CHAR和键多个控制。
本控制允许数字以及所有特殊键码(CTRL组合,箭头键,退格等),以便复制粘贴,撤消,重做,全选等仍然有效。它只会阻碍其他可打印字符(使用 string.printable )和Unicode字符(使用 WXK_NONE )
另一种方式来检查并允许所有特殊键码可以通过这个答案被发现。这是一个较好的方法,但需要更多的代码。
import string
MyNumCtrl = wx.TextCtrl()
MyNumCtrl.Bind(EVT_CHAR, onChar)
def onChar(self, event):
keycode = event.GetKeyCode()
obj = event.GetEventObject()
val = obj.GetValue()
# filter unicode characters
if keycode == wx.WXK_NONE:
pass
# allow digits
elif chr(keycode) in string.digits:
event.Skip()
# allow special, non-printable keycodes
elif chr(keycode) not in string.printable:
event.Skip() # allow all other special keycode
# allow '-' for negative numbers
elif chr(keycode) == '-':
if val[0] == '-':
obj.SetValue(val[1:])
else:
obj.SetValue('-' + val)
# allow '.' for float numbers
elif chr(keycode) == '.' and '.' not in val:
event.Skip()
return
请检查在wxPython演示 “Validator.py” 脚本。正是你所需要的。