所以我在 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/