IronPython WPF 与 RevitPythonShell
IronPython WPF withe RevitPythonShell
我根据我在 Whosebug 上找到的代码片段编写了这个脚本,但在运行时出现此错误:
System.InvalidOperationException: Cannot create more than one
System.Windows.Application instance in the same AppDomain.
我知道这与最后一条语句是在同一个 AppDomain 中创建一个新的 Application 实例这一事实有关,但我不知道如何解决这个问题。
这是脚本:
clr.AddReference('PresentationCore')
clr.AddReference("PresentationFramework")
clr.AddReference('Microsoft.Dynamic')
clr.AddReference('Microsoft.Scripting')
clr.AddReference('System')
clr.AddReference('IronPython')
clr.AddReference('IronPython.Modules')
clr.AddReference('IronPython.Wpf')
from System.Windows import Application, Window
from IronPython.Modules import Wpf as wpf
class AboutWindow(Window):
def __init__(selfAbout):
wpf.LoadComponent( selfAbout, os.path.join( folder, 'AboutWindow.xaml' ))
class MyWindow(Window):
def __init__(self):
wpf.LoadComponent( self, os.path.join( folder, 'IronPythonWPF.xaml' ))
def MenuItem_Click(self, sender, e):
form = AboutWindow()
form.ShowDialog()
if __name__ == '__main__':
Application().Run( MyWindow() )
This 似乎是解决方案,但不知道我需要修复此代码的哪些部分。
这是两个 XAML 文件的内容:
__WIP__wpfTest__AboutWindow.xaml
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="AboutWindow" Height="300" Width="300">
<Grid>
<TextBlock Text="AboutWindow" />
</Grid>
</Window>
__WIP__wpfTest__IronPythonWPF.xaml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="IronPythonWPF" Height="300" Width="300">
<StackPanel>
<Menu>
<MenuItem Header="About" Click="MenuItem_Click" />
</Menu>
<TextBlock Text="MainWindow" />
</StackPanel>
</Window>
根据 msdn,您应该可以使用 Window.Show (for a modeless version) or Window.ShowDialog(如果您想留在 Revit API 上下文中)
Application().Run( MyWindow() )
行基本上设置了一个事件循环 - Revit 在启动时已经为您做了一些事情,因此您可以继续显示您的 windows :)
我无法真正测试这个解决方案,因为我没有 AboutWindow.xaml
和 IronPythonWPF.xaml
,所以我只是在这里猜测...试一试,告诉我结果如何.
我根据我在 Whosebug 上找到的代码片段编写了这个脚本,但在运行时出现此错误:
System.InvalidOperationException: Cannot create more than one System.Windows.Application instance in the same AppDomain.
我知道这与最后一条语句是在同一个 AppDomain 中创建一个新的 Application 实例这一事实有关,但我不知道如何解决这个问题。 这是脚本:
clr.AddReference('PresentationCore')
clr.AddReference("PresentationFramework")
clr.AddReference('Microsoft.Dynamic')
clr.AddReference('Microsoft.Scripting')
clr.AddReference('System')
clr.AddReference('IronPython')
clr.AddReference('IronPython.Modules')
clr.AddReference('IronPython.Wpf')
from System.Windows import Application, Window
from IronPython.Modules import Wpf as wpf
class AboutWindow(Window):
def __init__(selfAbout):
wpf.LoadComponent( selfAbout, os.path.join( folder, 'AboutWindow.xaml' ))
class MyWindow(Window):
def __init__(self):
wpf.LoadComponent( self, os.path.join( folder, 'IronPythonWPF.xaml' ))
def MenuItem_Click(self, sender, e):
form = AboutWindow()
form.ShowDialog()
if __name__ == '__main__':
Application().Run( MyWindow() )
This 似乎是解决方案,但不知道我需要修复此代码的哪些部分。
这是两个 XAML 文件的内容:
__WIP__wpfTest__AboutWindow.xaml
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="AboutWindow" Height="300" Width="300">
<Grid>
<TextBlock Text="AboutWindow" />
</Grid>
</Window>
__WIP__wpfTest__IronPythonWPF.xaml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="IronPythonWPF" Height="300" Width="300">
<StackPanel>
<Menu>
<MenuItem Header="About" Click="MenuItem_Click" />
</Menu>
<TextBlock Text="MainWindow" />
</StackPanel>
</Window>
根据 msdn,您应该可以使用 Window.Show (for a modeless version) or Window.ShowDialog(如果您想留在 Revit API 上下文中)
Application().Run( MyWindow() )
行基本上设置了一个事件循环 - Revit 在启动时已经为您做了一些事情,因此您可以继续显示您的 windows :)
我无法真正测试这个解决方案,因为我没有 AboutWindow.xaml
和 IronPythonWPF.xaml
,所以我只是在这里猜测...试一试,告诉我结果如何.