前提・実現したいこと
Pythonの標準出力をリアルタイムで取得し、WPFのtextboxに表示したいと考えています。
Pythonで時間がかかる処理をしているときに、進捗状況を確認できればいいなと思った次第です。
発生している問題
非同期でpythonのコードを動かすため、process.BeginOutputReadLine()とし、標準出力があった際に出力を読み取りwpfのtextbox(tb1)に入れています。
非同期で実行、リアルタイムで読み取り、はできているようなのですが、リアルタイムで表示することができません。pythonの実行が終わった後、一度に全部の出力結果が表示されてしまいます。
該当のソースコード
C#
1namespace ConsoleRead 2{ 3 public partial class MainWindow : Window 4 { 5 Process pr = null; 6 int count = 0; // 確認用 7 8 public MainWindow() 9 { 10 InitializeComponent(); 11 } 12 13 private void Button_Start(object sender, RoutedEventArgs e) 14 { 15 HeavyMethod(); 16 } 17 18 public void HeavyMethod() 19 { 20 pr = new Process(); 21 22 pr.StartInfo.FileName = "pythonw.exe"; 23 pr.StartInfo.Arguments = "count.pyw"; 24 25 pr.StartInfo.UseShellExecute = false; 26 pr.StartInfo.RedirectStandardOutput = true; 27 pr.OutputDataReceived += process_DataReceived; 28 pr.EnableRaisingEvents = true; 29 pr.Exited += onExited; 30 31 pr.Start(); 32 pr.BeginOutputReadLine(); 33 } 34 35 // 標準出力があった際に実行 36 public void process_DataReceived(object sender, DataReceivedEventArgs e) 37 { 38 string output = e.Data + " : " + count + "\r\n"; 39 Dispatcher.BeginInvoke(new Action(() => 40 { 41 tb1.Text += output; 42 })); 43 count++; 44 } 45 46 // プロセス終了時に実行 47 public void onExited(object sender, EventArgs e) 48 { 49 if (pr != null) 50 { 51 pr.Close(); 52 pr.Dispose(); 53 54 MessageBox.Show("end"); 55 } 56 }
python
1# count.pyw 2 3import time 4 5for i in range(10): 6 time.sleep(0.5) 7 print("process" ,i*1)
//出力結果 process 0 : 0 process 1 : 1 process 2 : 2 process 3 : 3 process 4 : 4 process 5 : 5 process 6 : 6 process 7 : 7 process 8 : 8 process 9 : 9 : 10 //これが一度に表示されてしまうので、一行ずつ表示するようにしたい
何が問題なのかがわからなくなってしまいました…
力をお貸しいただければ幸いです。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/05 11:36