物理の駅 by onsanai

Physics Station → PhSt 質問・疑問・間違いの指摘は、コメントに書くか、直接伝えるときっと良いことがあります。主にWindows or Ubuntu用の記事です

C# WPFで グリッドマーク上にTextBlockやRectangleを配置する

供養

var textBlock = new TextBlock
{
    HorizontalAlignment = HorizontalAlignment.Center,
    VerticalAlignment = VerticalAlignment.Center,
    Text = text,
    FontSize = 0.1
};
var rectangle = new Rectangle
{
    Stroke = Brushes.Black,
    StrokeThickness = 0.3
};
Grid.SetColumn(textBlock, x);
Grid.SetRow(textBlock, y);
Grid2.Children.Insert(0, textBlock);

Grid.SetColumn(rectangle, x - 1);
Grid.SetColumnSpan(rectangle, 3);
Grid.SetRow(rectangle, y - 1);
Grid.SetRowSpan(rectangle, 3);
Grid2.Children.Insert(0, rectangle);

C#でPythonのスクリプトを実行して戻り値を取得する方法

英語をすらすら読める人はここを読めば全て解決する。 code.msdn.microsoft.com

C#からPythonを呼び出し、返り値を取得する方法としては、C#におけるプロセス間通信の一つである Process を使って、Pythonスクリプトを実行し、その標準出力(コンソール出力)をストリームで受け取るという方法が最も現実的だろう。

Python側ではmainに相当する部分と戻り値を渡すための print 文を書いておく必要がある。 Pythonの関数の戻り値そのものを取得できるわけではないので、ある関数だけ実行するということはできないし、想定していない標準出力には対応できない。 以下は、上記のURLのサンプル例を自分なりに修正したもの。

Program.cs

using System;
using System.Diagnostics;
using System.IO;

namespace ConsoleApp4_python
{
    class Program
    {
        static void Main(string[] args)
        {
            //下記のPythonスクリプトへのファイルパスを記述する
            string myPythonApp = "test.py"; 

            int x = 2;
            int y = 5;

            var myProcess = new Process
            {
                StartInfo = new ProcessStartInfo("python.exe")
                {
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    Arguments = myPythonApp + " " + x + " " + y
                }
            };

            myProcess.Start();
            StreamReader myStreamReader = myProcess.StandardOutput;
            string myString = myStreamReader.ReadLine();
            myProcess.WaitForExit();
            myProcess.Close();

            Console.WriteLine("Value received from script: " + myString);
        }
    }
}

test.py として以下のように書く。

import sys 
 
x = int(sys.argv[1])  
y = int(sys.argv[2]) 
 
print(x + y)

簡略化のため if __name__ == '__main__': は省略してあるが、あっても良い。

Pythonのファイルは、C#の実行時の作業フォルダと同じ場所に置き、Visual Studio等でコンパイルするなどして実行したら次のように表示されるだろう。

Value received from script: 7

フォルダ構成例と、Visual Studioコマンドプロンプトから C#コンパイルするための csc Program.cs を実行して Program.exe を作成し、実行してみた例を以下に示す。

f:id:onsanai:20200117001426p:plain