【问题标题】:IronPython WPF withe RevitPythonShellIronPython WPF 与 RevitPythonShell
【发布时间】:2015-11-07 22:31:06
【问题描述】:

我已经根据我在 stackoverflow 上找到的 sn-ps 编写了这个脚本,但在运行时出现了这个错误:

System.InvalidOperationException:不能创建多个 System.Windows.Application 实例在同一个 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> 

【问题讨论】:

    标签: python wpf revit-api revitpythonshell


    【解决方案1】:

    根据 msdn,您应该可以使用 Window.Show(对于无模式版本)或 Window.ShowDialog(如果您想留在 Revit API 上下文中)

    Application().Run( MyWindow() ) 行基本上设置了一个事件循环 - Revit 在启动时已经为您做了一些事情,所以您可以继续显示您的窗口 :)

    我无法真正测试此解决方案,因为我没有 AboutWindow.xamlIronPythonWPF.xaml,所以我只是在这里猜测...试试看,告诉我结果如何。

    【讨论】:

    • 好的,所以我将最后一行更改为: MyWindow().Show() 但现在它告诉我“LoadComponent() 正好需要 3 个参数(给定 2 个)”......它想使用由于某种原因,该函数的 LoadComponent(Object, Uri) 版本。
    • 实际上似乎 wpf 中的所有 LoadComponent() 重载都需要一个 CodeContext 对象作为第一个参数...:| ...我被困住了。
    • 嗯...好的,我会再试一次。你是从 RPS shell 窗口运行的吗?
    • 否 - 我创建了一个外部脚本来运行您的代码...我想知道这是否可能是 RPS 链接到的 .NET 版本的问题。如果我没记错的话,它从 RPS 2015 变为 RPS 2016...
    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多