This seems to be a somewhat 'intricate' problem. The problem is that Emacs uses python-shell-send-string to retrieve all kinds of information from the interactive shell in the background. One of the 'required' configurations to make this work correctly, is to start ipython with the --simple-prompt argument. But when starting ipython like this, input is no longer inserted (displayed) into the shell when using process-send-string. However, starting ipython without the argument, breaks the 'information retrieval functionality'. So, that is no option either.
Now, starting ipython without the --simple-prompt argument won't work, neither will changing (in some straightforward way) the python-shell-send-string function.
So then, I guess, the most straightforward solution is to create a custom command that simply copies the 'statement' to the ipython shell buffer, and then sends it from there. Starting from the python-shell-send-statement function, we could come up with a most basic 'custom' command that looks as follows:
(defun my-python-shell-send-statement ()
(interactive)
(let* ((region (if (region-active-p)
(cons (region-beginning) (region-end))
(cons
(save-excursion (python-nav-beginning-of-statement))
(save-excursion (python-nav-end-of-statement)))))
(string (buffer-substring (car region) (cdr region))))
(with-current-buffer (process-buffer (python-shell-get-process-or-error))
(insert string)
(comint-send-input))))
The above command can be used at least for sending single line statements. It can also be used for sending simple regions, but I guess it will break for more complex regions (although it might also just work for those).
Similarly, we could create 'custom' versions of the other python-shell-send-... functions, although it might take some extra work to get the strings formatted correctly in the ipython shell buffer (also the code above might work fine enough already; I have not tested it thoroughly).
This would be my first 'naive' approach, and it seems to work fine, at least for 'single line' statements. You can try the above command by evaluating it and using it via M-x or by binding it to your preferred key.
*Python*buffer. You'd need to change the code inpython-shell-send-stringso that the string is inserted in the buffer.