Chcę mieć kontrolę tekstu, która akceptuje tylko liczby. (Tylko wartości całkowite, takie jak 45 lub 366)Czy możliwe jest ograniczenie TextCtrl do akceptowania numerów tylko w wxPythonie?
Jaki jest najlepszy sposób na zrobienie tego? wszystko
Chcę mieć kontrolę tekstu, która akceptuje tylko liczby. (Tylko wartości całkowite, takie jak 45 lub 366)Czy możliwe jest ograniczenie TextCtrl do akceptowania numerów tylko w wxPythonie?
Jaki jest najlepszy sposób na zrobienie tego? wszystko
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.)
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()
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.
Proszę sprawdzić "Validator.py" skrypt w demo wxpython. to jest dokładnie to, czego potrzebujesz
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()