2009-09-02 111 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() 
相關問題