2009-09-02 233 views

回答

3

IntCtrl,Masked Edit ControlNumCtrl都是设计来完成这一工作的,具有不同的控制级别。检查“更多Windows /控件”下的wx演示,了解它们的工作原理。 (或者,如果你真的很希望直接用原始的TextCtrl来做这件事,我想你会想捕捉EVT_CHAR事件,测试这些字符,并且调用evt.Skip(),如果它是一个允许的字符。)

4

我不得不做类似的事情,检查字母数字代码。在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() 
1

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

-1

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

0

正如其他答案说明,可以用EVT_CHAR处理程序来完成此操作。您需要拨打event.Skip()查看您想要通过的字符,而不是将其称为您要阻止的字符。一个细微之处在于,您可能还想拨打event.Skip()作为制表符;按下标签会触发EVT_CHAR事件,如果您不呼叫event.Skip(),您将有效地禁用TextCtrl之间的标签遍历。

下面是显示两个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() 
相关问题