Ist es möglich, TextCtrl zu begrenzen Zahlen zu akzeptieren, nur in WxPython?
Frage
Ich möchte einen Text Kontrolle haben, dass nur Zahlen akzeptiert. (Nur ganzzahlige Werte wie 45 oder 366)
Was ist der beste Weg, dies zu tun?
Lösung
IntCtrl
, Masked Edit Control
und NumCtrl
sind so ausgelegt, genau dies zu tun, mit verschiedenen Ebenen der Kontrolle. Kasse die wx Demo unter „Mehr Fenster / Controls“ zu sehen, wie sie funktionieren.
(Oder, wenn Sie stattdessen wirklich freuen uns darauf, diese direkt mit einem rohen TextCtrl zu tun, ich glaube, Sie zu fangen EVT_CHAR Ereignisse wollen würde, um die Zeichen testen, und rufen evt.Skip (), wenn es wurde ein erlaubter Charakter.)
Andere Tipps
hatte ich etwas Ähnliches zu tun, für die alphanumerischen Codes zu überprüfen. Die Spitze auf EVT_CHAR war das Richtige:
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()
Sie können versuchen, IntCtrl
, EVT_CHAR
oder implementieren einen neuen / bestehenden Validator (wie IntValidator ). Validatoren kann verwendet werden, um ein Feld zu validieren (nützlich, wenn mehrere Dinge auf einem Dialog / Platte zu bestätigen versuchen), und sie können auch mit EVT_CHAR zu beschränken Eingabe in einem Feld.
Wie andere Antworten beachten, ist es möglich, dies mit einem EVT_CHAR
Handler zu tun. Sie werden event.Skip()
für die Charaktere nennen wollen Sie lassen durch wollen, und es ist nicht für diejenigen, rufen Sie blockieren möchten. Eine Nuance ist, dass Sie wahrscheinlich auch event.Skip()
für Tabulatoren nennen wollen; Registerkarte Drücken löst die EVT_CHAR
Ereignis, und wenn Sie dies nicht tun Anruf event.Skip()
, werden Sie effektiv deaktivieren Registerkarte Traversal zwischen TextCtrl
s.
Hier ist eine minimal-Anwendung zwei TextCtrl
s zeigt, die ganzen oder Dezimalzahlen akzeptieren, mit arbeitenden Registerkarte Traversal:
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()
NumCtrl hat einige seltsame Macken zu mir. Hier ist mein Versuch, eine Anzahl Steuerung basierend auf EVT_CHAR und keycode zu erstellen.
Diese Steuerung erlaubt Zahlen sowie alle Sonder keycode (ctrl-Combo, Pfeiltaste, Rücktaste etc ...), so dass Copy-Paste, Undo-Redo, wählen Sie alles etc funktioniert immer noch. Es wird nur andere druckbare Zeichen blockieren (unter Verwendung von string.printable ) und Unicode-Zeichen ( WXK_NONE
Eine andere Möglichkeit, alle speziellen Tastencode zu überprüfen und zulassen kann von diese Antwort . Dies ist ein besserer Ansatz erfordert aber mehr Code.
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
Bitte überprüfen "Validator.py" Skript in wxpython Demo. es ist genau das, was Sie
brauchen