首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当调用.NET构造函数时,PythonforSystem.Windows.Forms.Form失败。

当调用.NET构造函数时,PythonforSystem.Windows.Forms.Form失败。
EN

Stack Overflow用户
提问于 2013-03-22 05:25:08
回答 2查看 832关注 0票数 3

C#码

下面的C#代码编译成一个名为“C#”的库

代码语言:javascript
复制
using System;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsTest
{
    public static class CreateACoolWindow
    {
        public static void Main(string[] args)
        {
            CreateWindow();
        }

        public static void CreateWindow()
        {
            Thread winFormsThread = new Thread(new ThreadStart(StartFormApplication));
            winFormsThread.SetApartmentState(ApartmentState.STA);
            winFormsThread.Start();
            Console.WriteLine("Started thread");
        }

        private static void StartFormApplication()
        {
            Application.EnableVisualStyles();
            Console.WriteLine("EnableVisualStyles");
            Application.SetCompatibleTextRenderingDefault(false);
            Console.WriteLine("SetCompatibleTextRenderingDefault");
            FormSubClass dmw = new FormSubClass();
            Console.WriteLine("Created window object");
            Application.Run(dmw);
        }
    }

    public class FormSubClass : Form
    {
        public FormSubClass()
        {
            Console.WriteLine("FormSubClass Constructor called");
            InitializeComponent();
        }

        private void InitializeComponent()
        {
            Console.WriteLine("Starting component init......");
            this.SuspendLayout();
            this.AutoScaleDimensions = new SizeF(6F, 13F);
            this.AutoScaleMode = AutoScaleMode.Font;
            this.ClientSize = new Size(300, 500);
            this.Name = "FormSubClass";
            this.Text = "FormSubClass";
            this.ResumeLayout(false);
            this.PerformLayout();

        }
    }
}

Python代码

使用Pythonfor.NET和Python2.7用于x86,我尝试从这个C#库调用CreateWindow()方法。

我的python代码如下:

代码语言:javascript
复制
import clr
clr.AddReference("MinimalFormsApp")

from WindowsFormsTest import CreateACoolWindow
CreateACoolWindow.CreateWindow()

#Print some output
print "Mary had a little lamb,"
print "it's fleece was white as snow;"
print "and everywhere that Mary went",
print "her lamb was sure to go."

控制台输出

这就是Python在控制台输出的内容。

启动线程 玛丽有只小羊羔,EnableVisualStyles SetCompatibleTextRenderingDefault,它的羊毛是白色的,像雪; 无论玛丽走到哪里,她的羔羊都肯定要去。 FormSubClass构造函数调用

可以看到,它没有打印“启动组件init.”它不打印“已创建的窗口对象”,也没有实际创建任何窗口。Python程序结束并没有产生错误消息,说明为什么没有创建窗口。

如果我从另一个C#程序调用相同的C#库,一切都会按预期的方式打印,并创建窗口。

有人知道为什么.NET的Python在表单构造器上失败吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-26 06:01:06

当Python中的主线程终止时,它也会终止在.NET中运行的所有东西。

在上面给出的示例中,在将文本打印到终端之后,在主Python线程终止之前,窗口还没有时间进行绘制。

在新的python线程中启动.NET调用将阻止此操作。

票数 1
EN

Stack Overflow用户

发布于 2013-07-24 17:11:14

只是在寻找另一个问题时偶然发现了这个问题。我有点晚了,但我想我可以提供一个洞察为什么会发生这种情况的任何人谁有类似的问题。

当CPython解释器跟踪线程时,它将线程分为三类。

  • 正常
  • 守护进程
  • 外星人

对于通过线程模块启动的常规python线程来说,这是正常的。当这些线程或主线程运行时,解释器不会退出。

类似地,守护进程线程是通过线程模块启动的线程;但是,它们被标记为守护进程。在他们的情况下,解释器不等待他们在退出前终止。

最后,外星线程是在与CPython相同的进程中启动的线程,但没有由任何python代码启动。解释器知道这些,但不知道如何等待它们,因此将它们视为守护进程线程,而不等待它们在退出之前终止。

要更好地处理windows上的线程(加上没有GIL),请查看IronPython。它可能会慢一些,但是它只处理像这样的.NET交互,因为它是作为本地.NET运行的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15563309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档