10

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

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

4

7 回答 7

9

我不得不做类似的事情,检查字母数字代码。关于 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()
于 2009-10-19T18:13:24.557 回答
5

IntCtrl, Masked Edit Control, 和NumCtrl所有这些都是为了做到这一点而设计的,具有不同的控制级别。查看“更多 Windows/控件”下的 wx 演示,了解它们是如何工作的。

(或者,如果您真的希望直接使用原始 TextCtrl 执行此操作,我认为您希望捕获 EVT_CHAR 事件,测试字符,如果它是允许的字符,则调用 evt.Skip()。)

于 2009-09-02T21:38:56.197 回答
1

您可以尝试IntCtrlEVT_CHAR或实现一个新的/现有的验证器(如IntValidator)。验证器可用于验证字段(在尝试验证对话框/面板上的多个内容时很有用),它们也可以与 EVT_CHAR 一起使用以限制字段中的输入。

于 2011-04-26T20:53:51.677 回答
1

正如其他答案所指出的,可以使用EVT_CHAR处理程序来执行此操作。您需要调用event.Skip()要让通过的字符,而不是调用要阻止的字符。一个细微差别是您可能还想调用event.Skip()制表符;按 tab 会触发EVT_CHAR事件,如果你不调用event.Skip(),你将有效地禁用TextCtrls 之间的 tab 遍历。

这是一个最小的应用程序,显示两个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()
于 2018-01-07T23:18:10.707 回答
0

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
于 2018-06-12T02:26:31.070 回答
0

我想要相同的,但对于浮点数,所以我在课堂上使用了以下方法:

 def force_numeric(self, event, edit):
    raw_value =  edit.GetValue().strip()
    keycode = event.GetKeyCode()
    if keycode < 255:
        print('keycode:', keycode,'chr(keycode) ', chr(keycode))
        if chr(keycode).isdigit() or chr(keycode)=='.' and '.' not in raw_value:
            print('skip')
            event.Skip()

在构造函数中注册事件:

    item = wx.TextCtrl(self.panel, -1, str(pose_config['locref_stdev']))
    item.Bind(wx.EVT_CHAR, lambda event: self.force_numeric(event, item))

修改上面的答案

于 2019-10-30T13:28:00.770 回答
-1

请检查 wxpython 演示中的“Validator.py”脚本。这正是您所需要的

于 2014-04-14T06:03:49.813 回答