It is not getting everything because that's exactly how the validatecommand works -- it calls a function before the text is inserted, to give you a chance to veto the insertion if the character isn't valid.
You can have Tkinter pass in the value before the change, the value if the change is accepted, the text that was inserted, and several other things to aid you in doing the validation. For an example, see this answer: https://stackoverflow.com/a/4140988/7432