仅使用数值格式化 wx.TextCtrl - 浮点精度

问题描述 投票:0回答:2

我创建了一个简单的应用程序,它使用带有 wxFILTER_NUMERIC 的纯 TextCtrl 小部件,以便仅接受数字值(请参阅下面的代码)。

我希望这些值具有固定的显示精度,无论用户如何输入它们(例如,在指定 17.0 或 17.000000 值的情况下将始终显示 17.0000)。我发现在 wxPython 中有一个选项可以使用派生的 NumCtrl 小部件(http://wxpython.org/docs/api/wx.lib.masked.numctrl-module.html),它可以完成这项工作,但我找不到它位于基本的 wxWidgets 库中。

那么,在我根本找不到的地方是否有一个现成的解决方案,或者我是否必须编写一个函数,在插入数字后手动更改数字的格式(处理 EVT_TEXT 和 EVT_TEXT_ENTER 事件并修改输入字符串)?

到目前为止我所拥有的:

活动表

BEGIN_EVENT_TABLE(MyFrame, wxFrame) 
    EVT_MENU(ID_Quit, MyFrame::OnQuit)
    EVT_MENU(ID_About, MyFrame::OnAbout)
    EVT_TEXT(ID_textBox, MyFrame::ValueChanged)
    EVT_TEXT_ENTER(ID_textBox, MyFrame::ValueChanged)
END_EVENT_TABLE()

MyFrame 内文本框的实现

wxPanel *panel = new wxPanel(this, -1);

    _textBox1 = new wxTextCtrl(panel,
         ID_textBox, 
         "0.0000", 
         wxPoint(100, 100), 
         wxSize(80,20),
         wxTE_PROCESS_ENTER,
         wxTextValidator(wxFILTER_NUMERIC,&_myValue),
         wxTextCtrlNameStr); 

处理功能

void MyFrame::ValueChanged(wxCommandEvent& WXUNUSED(event))
{
    // modify the string or do something clever
}

采用的解决方案 感谢您的回答,问题已经解决。这是我的做法:

`

wxFloatingPointValidator<double> _val(2,&_myValue,wxNUM_VAL_ZERO_AS_BLANK);
    _val.SetRange(0.,100.);     // set allowable range

_textBox1 = new wxTextCtrl(panel,   // create a textCtrl
     ID_textBox, 
     "0.0000", 
     wxPoint(100, 30), 
     wxSize(80,20),
     wxTE_PROCESS_ENTER,
     _val,          // associate the text box with the desired validator
     wxTextCtrlNameStr); 

`

c++ visual-c++ wxpython wxwidgets
2个回答
2
投票

请参阅 wxWidgets 2.9 中提供的 wxFloatingPointValidator


0
投票

我个人使用了一个侦听器来检查来自键盘的每个输入,并仅在它是数值或“.”时才启用它。浮点值。

这是您可以从中构建的代码(:

用途:

self.__MyTxtCtrl.Bind(wx.EVT_CHAR, self.__on_change_text_check_is_int_value)


def __on_change_text_check_is_int_value(self, evt):
        KeyboardEventUtils.on_change_text_check_is_int_value(self, evt)

KeyboardEventUtils.py 类中的事件处理程序:

from pyglet.window import key

FLOAT_POINT = "."

ENTRY_ID = "id"
ENTRY_KEY_EVENT = "keyEvent"
ENTRY_SELECTION_EVENT = "selectionEvent"

MASK_STARTED_RIGHT_SELECTION = 1
MASK_STARTED_LEFT_SELECTION = -1

class KeyboardEventUtils(object):

    __mLastEvt = {}

    def check_input_key_only_numeric_value(value, strng):
        return value.isnumeric() or (value == FLOAT_POINT and not FLOAT_POINT in strng and len(strng) > 0)

    def on_change_text_check_is_int_value(self, evt):
        txt = evt.GetEventObject()
        value = chr(evt.GetUnicodeKey())

        if KeyboardEventUtils.__mLastEvt != None and len(KeyboardEventUtils.__mLastEvt) > 0 and KeyboardEventUtils.__mLastEvt[ENTRY_ID] != txt.GetId():
            self._mLastEvt = {}

        if check_input_key_only_numeric_value(value, txt.GetValue()):
            pos = txt.GetInsertionPoint()
            txt.SetValue(txt.GetValue()[:pos] + value + txt.GetValue()[pos:])
            txt.SetInsertionPoint(pos + 1)

        elif (evt.GetModifiers() == 4 or evt.GetModifiers() == key.MOD_SHIFT) and evt.GetRawKeyCode() == key.LEFT:            # 4 (?) key.MOD_SHIFT (?)              TO FIX
            pos = txt.GetInsertionPoint()
            rng = list(txt.GetSelection())

            if rng[0] == rng[1] and ENTRY_SELECTION_EVENT in KeyboardEventUtils.__mLastEvt:
                del KeyboardEventUtils.__mLastEvt[ENTRY_SELECTION_EVENT]

            if ENTRY_SELECTION_EVENT in KeyboardEventUtils.__mLastEvt and KeyboardEventUtils.__mLastEvt[ENTRY_SELECTION_EVENT] == MASK_STARTED_RIGHT_SELECTION:

                rng[1] = rng[1] - 1
            else:
                KeyboardEventUtils.__mLastEvt[ENTRY_SELECTION_EVENT] = MASK_STARTED_LEFT_SELECTION
                rng[0] = rng[0] - 1

            txt.SetSelection(rng[0], rng[1])

        elif (evt.GetModifiers() == 4 or evt.GetModifiers() == key.MOD_SHIFT):            # 4 (?) key.MOD_SHIFT (?)             TO FIX
            pos = txt.GetInsertionPoint()
            rng = list(txt.GetSelection())

            if rng[0] == rng[1] and ENTRY_SELECTION_EVENT in KeyboardEventUtils.__mLastEvt:
                del KeyboardEventUtils.__mLastEvt[ENTRY_SELECTION_EVENT]

            if ENTRY_SELECTION_EVENT in KeyboardEventUtils.__mLastEvt and KeyboardEventUtils.__mLastEvt[ENTRY_SELECTION_EVENT] == MASK_STARTED_LEFT_SELECTION:
                rng[0] = rng[0] + 1
            else:
                KeyboardEventUtils.__mLastEvt[ENTRY_SELECTION_EVENT] = MASK_STARTED_RIGHT_SELECTION
                rng[1] = rng[1] + 1

            txt.SetSelection(rng[0], rng[1])

        elif evt.GetRawKeyCode() == key.LEFT:
            rng = list(txt.GetSelection())

            if rng[0] != rng[1]:
                txt.SetInsertionPoint(rng[0])
            else:
                txt.SetInsertionPoint(txt.GetInsertionPoint() - 1)

        elif evt.GetRawKeyCode() == key.RIGHT:
            rng = list(txt.GetSelection())

            if rng[0] != rng[1]:
                txt.SetInsertionPoint(rng[1])
            else:
                txt.SetInsertionPoint(txt.GetInsertionPoint() + 1)

        elif evt.GetRawKeyCode() == key.UP or evt.GetRawKeyCode() == key.DOWN:
            pass

        elif evt.GetRawKeyCode() == key.BACKSPACE:                                              
            pos = txt.GetInsertionPoint()
            if txt.GetStringSelection() == "":
                txt.SetValue(txt.GetValue()[:pos-1] + txt.GetValue()[pos:])
                txt.SetInsertionPoint(pos - 0x1)
            else:
                r = txt.GetSelection()
                txt.SetValue(txt.GetValue()[:r[0]] + txt.GetValue()[r[1]:])
                txt.SetInsertionPoint(pos)

        elif evt.GetRawKeyCode() == key.DELETE:
            pos = txt.GetInsertionPoint()
            if txt.GetStringSelection() == "":
                txt.SetValue(txt.GetValue()[:pos] + txt.GetValue()[pos+1:])
            else:
                r = txt.GetSelection()
                txt.SetValue(txt.GetValue()[:r[0]] + txt.GetValue()[r[1]:])
            txt.SetInsertionPoint(pos)

        elif evt.GetModifiers() == key.MOD_CTRL and evt.GetRawKeyCode() == key.A:
            txt.SelectAll()

        else:

            KeyboardEventUtils.__mLastEvt[ENTRY_ID] = txt.GetId()
            KeyboardEventUtils.__mLastEvt[ENTRY_KEY_EVENT] = evt
            return False

        KeyboardEventUtils.__mLastEvt[ENTRY_ID] = txt.GetId()
        KeyboardEventUtils.__mLastEvt[ENTRY_KEY_EVENT] = evt
        return True
© www.soinside.com 2019 - 2024. All rights reserved.