Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
When I first got my Python host working, I could type expressions and they would run...but I couldn't see the output. I had to dig a little bit, but found that Python was sending its output to sys.stdout, which at startup is set to a PythonFile wrapping .NET's Console. To get what I wanted, I need to set sys.stdout to go back to my TextBox. To do this I added a couple of lines you've already seen. In the ConsolePane class, I wrote this:
TextBoxStream stream = new TextBoxStream(this.textBox);
this.processor = new PythonProcessor(stream);
and then in the PythonProcessor ctor, I set stdout:
sys.stdout = new PythonFile(outputStream, "w", false);
Then things worked nicely. Of course I had to write the TextBoxStream class. Fortunately, it only needed to write. Here's that code:
namespace AddInConsole
{
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
class TextBoxStream : Stream
{
private TextBox textBox = null;
public TextBoxStream(TextBox textBox)
{
this.textBox = textBox;
}
public override bool CanRead
{
get { return false; }
}
public override bool CanSeek
{
get { return false; }
}
public override bool CanWrite
{
get { return true; }
}
public override void Flush()
{
// Do nothing
}
public override long Length
{
get { return this.textBox.Text.Length; }
}
public override long Position
{
get
{
return this.textBox.CaretIndex;
}
set
{
throw new NotImplementedException("The method or operation is not implemented.");
}
}
public override int Read(byte[] buffer, int offset, int count)
{
throw new NotImplementedException("Read not implemented");
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException("The method or operation is not implemented.");
}
public override void SetLength(long value)
{
throw new NotImplementedException("The method or operation is not implemented.");
}
public override void Write(byte[] buffer, int offset, int count)
{
// IronPython uses Encoding.ASCII to write to a stream...so we'll pull it back out
// the same way
byte[] convertBuffer = new byte[count];
Array.Copy(buffer, offset, convertBuffer, 0, count);
string output = Encoding.ASCII.GetString(convertBuffer);
this.textBox.AppendText(output);
}
}
}