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?

War es hilfreich?

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.

verwendet werden

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 TextCtrls.

Hier ist eine minimal-Anwendung zwei TextCtrls 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top