質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2330閲覧

【WPF】Pythonの標準出力をリアルタイムに表示したい

7_kamakiri7_

総合スコア2

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2021/06/05 10:12

前提・実現したいこと

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 //これが一度に表示されてしまうので、一行ずつ表示するようにしたい

何が問題なのかがわからなくなってしまいました…
力をお貸しいただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python の呼び出しに -u オプションを付け加えてみてはどうですか。
パイプなどに渡す際にバッファリングをオフにします。

投稿2021/06/05 11:16

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

7_kamakiri7_

2021/06/05 11:36

一発で解決しました…! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問