如何在C#中将Pythonnet的PyObject转换为字符串并显示到文本框
问题描述
我正在用Pythonnet开发调用Python后端的C# GUI程序,刚学两者的交互方法,需要把Python中计算得到的变量传入C#并显示在文本框里。现在Python计算出的outer值能正常输出到控制台,但没法显示在textBox1中,报错提示无法将PyObject转换为字符串。
现有代码
public Form1() { InitializeComponent(); Runtime.PythonDLL = @"C:\Program Files (x86)\Python312-32\python312.dll"; } private void button1_Click(object sender, EventArgs e) { //THIS WORKS NOW!! PyModule scope; PythonEngine.Initialize(); using (Py.GIL()) { scope = Py.CreateScope(); //scope.Exec("print('Hello World from Python!')"); dynamic np = Py.Import("numpy"); dynamic outer=(np.cos(np.pi * 2)); //This is the part that does not work. //It says can't convert a PyObject to a string. textBox1.Text = outer } }
解决方法
问题核心是outer是Pythonnet的PyObject类型,无法直接赋值给要求字符串类型的TextBox.Text,可以用以下几种方式转换:
方法1:直接调用ToString()
利用Pythonnet对PyObject的ToString重载,直接转为字符串:textBox1.Text = outer.ToString();方法2:转换为C#数值类型再转字符串
因为np.cos返回的是numpy浮点数,可直接转成C#的double类型,再转换为字符串:textBox1.Text = ((double)outer).ToString();方法3:使用Convert.ToString()
借助C#的类型转换工具类完成转换:textBox1.Text = Convert.ToString(outer);
另外注意:PythonEngine.Initialize()建议只调用一次,比如移到Form的构造函数里,避免多次点击按钮重复初始化引发错误:
public Form1() { InitializeComponent(); Runtime.PythonDLL = @"C:\Program Files (x86)\Python312-32\python312.dll"; PythonEngine.Initialize(); // 移至此处初始化一次 } private void button1_Click(object sender, EventArgs e) { PyModule scope; using (Py.GIL()) { // ... 原有代码 ... } }
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

