stdin in embedded python

K

KillSwitch

I have a C++ program, with a GUI, into which I have embedded python. I
have made several python functions in C++, one of which I use to
override the normal stdout and stderr so that they print to a text box
of my GUI. One thing I cannot think of how to do is to redefine stdin
so that it pauses the program, waits for a user to type input into the
box, hit enter, and takes input from another text element and sends it
to python like it was the console.

I wonder if anyone could help me in trying to do such a thing. To
simplify, the new stdin should wait for the C++ function to give it a
value, like it waits for the console.
 
D

Dave Angel

KillSwitch said:
I have a C++ program, with a GUI, into which I have embedded python. I
have made several python functions in C++, one of which I use to
override the normal stdout and stderr so that they print to a text box
of my GUI. One thing I cannot think of how to do is to redefine stdin
so that it pauses the program, waits for a user to type input into the
box, hit enter, and takes input from another text element and sends it
to python like it was the console.

I wonder if anyone could help me in trying to do such a thing. To
simplify, the new stdin should wait for the C++ function to give it a
value, like it waits for the console.
I suspect you don't really want to redirect stdin, but instead implement
raw_input(). If you have control over the script, just change it from
raw_input() to cpp_raw_input(). But if you need to be able to run
arbitrary scripts, ...

(untried) - Try changing __builtins__.raw_input to reference your new
function.

DaveA
 
K

KillSwitch

I suspect you don't really want to redirect stdin, but instead implement
raw_input().  If you have control over the script, just change it from
raw_input() to cpp_raw_input().  But if  you need to be able to run
arbitrary scripts, ...

(untried) - Try changing __builtins__.raw_input  to reference your new
function.

DaveA

But what would the function do? How would it pause python and wait for
it to have text to send?
 
D

Dave Angel

Gabriel said:
En Sun, 01 Nov 2009 13:34:44 -0300, KillSwitch
KillSwitch wrote:
I have a C++ program, with a GUI, into which I have embedded
python. I
have made several python functions in C++, one of which I use to
override the normal stdout and stderr so that they print to a text
box
of my GUI. One thing I cannot think of how to do is to redefine stdin
so that it pauses the program, waits for a user to type input into
the
box, hit enter, and takes input from another text element and
sends it
to python like it was the console.

I suspect you don't really want to redirect stdin, but instead
implement
raw_input(). [...]Try changing __builtins__.raw_input to reference
your new
function.

But what would the function do? How would it pause python and wait for
it to have text to send?

Whatever you want. You don't have to "pause python", Python itself
won't resume until your function doesn't return. (You should release
the GIL if your C++ function doesn't call back to Python code, to
allow other threads to continue, but that's another story).
This is a raw_input replacement written in Tkinter; it shows a dialog
box instead of reading from stdin:

py> from Tkinter import *
py> from tkSimpleDialog import askstring
py> def my_raw_input(prompt):
... return askstring("Python", prompt)
...
py> root = Tk()
py> import __builtin__
py> __builtin__.raw_input = my_raw_input
py>
py> raw_input("What's your name?")
'Gabriel'
I think I see the OP's problem. He has written a GUI program in C++,
and is using (embedding) Python functions into it. So presumably those
functions are being called from events in the C++ event loop.

If one of those functions tries to call back into C++ code, the event
loop will never get control, to process the events from the standard UI
controls.

So if the input is to be handled as an integral part of the C++ UI,
there's a distinct problem.

On the other hand, Gabriel's dialog box should work fine, as long as you
don' t mind a modal dialog box as a solution. I don't know tkinter's
askstring, but I suspect it'd work. However, the rest of the C++ GUI
would be frozen, which could be a problem.

DaveA
 
G

Gabriel Genellina

Gabriel said:
En Sun, 01 Nov 2009 13:34:44 -0300, KillSwitch
KillSwitch wrote:
I have a C++ program, with a GUI, into which I have embedded
python. I
have made several python functions in C++, one of which I use to
override the normal stdout and stderr so that they print to a text
box
of my GUI. One thing I cannot think of how to do is to redefine
stdin
so that it pauses the program, waits for a user to type input into
the
box, hit enter, and takes input from another text element and sends
it
to python like it was the console.

I suspect you don't really want to redirect stdin, but instead
implement
raw_input().

But what would the function do? How would it pause python and wait for
it to have text to send?

Whatever you want. You don't have to "pause python", Python itself
won't resume until your function doesn't return. [example using
Tkinter.askstring]
I think I see the OP's problem. He has written a GUI program in C++,
and is using (embedding) Python functions into it. So presumably those
functions are being called from events in the C++ event loop.

If one of those functions tries to call back into C++ code, the event
loop will never get control, to process the events from the standard UI
controls.

So if the input is to be handled as an integral part of the C++ UI,
there's a distinct problem.

On the other hand, Gabriel's dialog box should work fine, as long as you
don' t mind a modal dialog box as a solution. I don't know tkinter's
askstring, but I suspect it'd work. However, the rest of the C++ GUI
would be frozen, which could be a problem.

Perhaps looking a other examples may help. Both IDLE and PythonWin replace
raw_input with a message box; IDLE is a Tkinter application, and PythonWin
wraps MFC. Both have a main message loop and use a modal message box.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,186
Members
46,740
Latest member
JudsonFrie

Latest Threads

Top