c# - 使用 IronPython 控制 C# Winforms GUI

标签 c# python winforms ironpython

所以我在 Visual Studio 中使用 C# 制作了一个 Winforms GUI,但对于我正在处理的项目,我希望大部分代码是用 Python 编写的。我希望用 python 编写“引擎”(为了可移植性),然后让应用程序界面成为我可以换掉的东西。

我将 C# 项目编译为 .dll,并且能够将这些类导入到 IronPython 脚本中并正常启动 GUI。

问题是运行 GUI 会停止 Python 脚本的执行,除非我将它放入一个单独的线程中。但是,如果我将 GUI 放入一个单独的线程中并尝试使用原始 python 线程来更改状态信息,我会得到一个异常,即从与创建它的线程不同的线程修改控件。

是否有任何与 GUI 线程通信的好方法或完成我正在尝试做的事情的方法?

GUI的C#驱动:

public class Program
{
    private static MainWindow window;

    [STAThread]
    static void Main()
    {
        Program.RunGUI();
    }

    public static void RunGUI()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        window = new MainWindow();
        Application.Run(window);
    }

    public static void SetState(GameState state)
    {
        window.State = state;
    }
}

和 python 脚本:

import clr
clr.AddReferenceToFile("TG.Model.dll")
clr.AddReferenceToFile("TG.UI.dll")
from TG.Model import GameState
from TG.UI import Program
import thread
import time


def main():
    print "Hello!"
    state = GameState()
    print state.CharacterName
    print dir(Program)
    thread.start_new_thread(Program.RunGUI, ())
    #Program.RunGUI()
    time.sleep(2)
    Program.SetState(state)
    raw_input()


if __name__ == "__main__":
    main()

最佳答案

将调用 Program.RunGUI() 之后的所有内容放入事件处理程序中。

C#:

public static void RunGUI(EventHandler onLoad)
{   
    ...

    window = new MainWindow();
    window.Load += onLoad;
    Application.Run(window);
    window.Load -= onLoad; //removes handler in case RunGUI() is called again
}

python :

def onload(sender, args):
    time.sleep(2)
    Program.SetState(state)
    raw_input()  

def main():
    ...
    Program.RunGUI(onload)

关于c# - 使用 IronPython 控制 C# Winforms GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3402366/

相关文章:

c# - 为非托管代码提供托管控制句柄 - 访问冲突

c# - 如何在 UserControl 中创建部分客户区?

python - QT QItemSelectionModel 忽略列?

c# - 获取另一个线程上的 RichTextBox 中的文本

c# - ASP.NET C# 使用 System.IO 复制目录和子目录

javascript - 使用 C# 和 Selenium WebDriver 渲染页面时禁用 Chrome 中的 JavaScript

c# - 您如何将 Excel 工作表复制到新工作簿中并带来所有图表、图像等?

c# - 带有行号的 Xamarin Insights

python - 矩阵中列的最大值列表(没有 Numpy)

python - 根据包含的字典键替换 Pandas DataFrame 列值