0

我正在从 IronPython shell 启动一个 winform。然后我的表单调用了一个脚本,该脚本运行了几个小时并将输出写入 shell。

脚本运行时,GUI 被阻止(我无法点击任何按钮或将其最小化)。

我尝试了这些方法:

  1. 当我用 ShowDialog() 打开表单时,表单保持在前面。我无法将 python shell 放在前面并滚动书面评论。我必须先关闭表单,但这不是我想要的。
  2. 当我用 Show() 打开表单时,我可以将 python shell 放在前面并可以滚动它,但是当我关闭 python shell 时(在关闭 winform 之前),winform 保持打开状态并且现在被阻止;我只能使用任务管理器杀死它。

所以,我想要的是案例 2 中的情况,但是当我关闭我的 python shell 时,winform 也应该自动关闭。

在这里阅读了一些其他问题后,我考虑使用 Show() 开始表单,但将 Modal 属性设置为 true,但是当我尝试从 shell 执行此操作时,它说该属性是私有的。我在 Visual Studio 中创建了表单,那么是否可以在某处设置 Modal 属性?

4

1 回答 1

1

我认为您需要通过以下方式让您的 UI 处理应用程序的 Windows 事件:

Application.DoEvents()

模态窗口为您工作的原因是因为它在幕后自动循环并自动处理窗口消息。

这是一个示例 C# 和 IronPython 代码,用于模拟显示 Windows 窗体的长时间运行脚本

var py = Python.CreateEngine();
var script = @"
import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import *
from System.Threading import *
frm = Form()
frm.Show()
while True:
    Thread.Sleep(100)
    Application.DoEvents()
";
var source = py.CreateScriptSourceFromString(script);
var scope = py.CreateScope();
source.Execute(scope);

请注意,python 代码只是无限循环(模拟您长时间运行的脚本)重要的是您的脚本有机会能够调用 DoEvents 来更新 UI。如果不是这种情况,并且您的脚本将在单个调用上阻塞很长时间,您可能会考虑在单独的线程中运行脚本本身,这将允许您让主线程可用于处理消息。

在创建线程时要小心,Winforms 不喜欢从单独的线程创建或更新,因此请确保通过将它们同步到主线程来调用 UI 更新方法。

使用上面的示例代码,当我关闭控制台窗口时,Winform 也会被窗口自动销毁。所以我没有看到你描述的问题。

于 2012-05-08T05:38:39.377 回答