我想要一个只接受数字的文本控件。(只是整数值,如 45 或 366)

做这个的最好方式是什么?

有帮助吗?

解决方案

IntCtrlMasked 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(),你会有效地禁用TextCtrls之间标签穿越。

下面的示出了两个TextCtrls接受整数或十进制数最小的应用程序中,与工作标签遍历:

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” 脚本。正是你所需要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top