2009-09-02 18 views

Odpowiedz

3

IntCtrl, Masked Edit Control i NumCtrl są przeznaczone właśnie do tego, z różnymi poziomami kontroli. Sprawdź demo wx w sekcji "Więcej okien/kontrolek", aby zobaczyć, jak działają.

(Jeśli zamiast tego naprawdę chcesz zrobić to bezpośrednio z nieprzetworzonym TextCtrl, myślę, że chcesz złapać EVT_CHAR zdarzenia, przetestować znaki i wywołać evt.Skip(), jeśli to był dozwolony charakter.)

4

Musiałem zrobić coś podobnego, sprawdzając kody alfanumeryczne. Końcówka na EVT_CHAR było słuszne:

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

Można spróbować IntCtrl, EVT_CHAR lub wdrożenie nowej/istniejącej walidator (jak IntValidator). Walidatory mogą być używane do sprawdzania poprawności pola (przydatne przy próbie sprawdzenia poprawności wielu rzeczy w oknie dialogowym/panelu) i mogą być również używane z EVT_CHAR w celu ograniczenia wprowadzania danych w polu.

-1

Proszę sprawdzić "Validator.py" skrypt w demo wxpython. to jest dokładnie to, czego potrzebujesz

0

Jak można zauważyć w innych odpowiedziach, można to zrobić za pomocą obsługi EVT_CHAR. Będziesz chciał zadzwonić pod numer event.Skip() dla postaci, które chcesz przepuścić, i nie nazywać go tymi, które chcesz zablokować. Jednym z niuansów jest to, że prawdopodobnie chcesz również wywołać event.Skip() dla znaków tabulacji; naciśnięcie tab uruchamia zdarzenie EVT_CHAR, a jeśli nie zadzwonisz pod numer event.Skip(), skutecznie zablokujesz przechodzenie kart między TextCtrl s.

Oto minimalne zastosowanie pokazano dwa TextCtrl s, które akceptują całkowitą lub cyfr po przecinku, z zakładki roboczego przechodzenia:

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()