Ошибка Pythonnet: XamlParseException: «Не удалось создать« клик »из текста - PullRequest
0 голосов
/ 24 сентября 2018

Раньше я работал над IronPython (с WPF для разработки некоторых графических интерфейсов), а недавно я начал пробовать pythonnet.

Но я обнаружил, что файл xaml, который работал на IronPython, не работает на CPython + pythonnet.В IronPython я могу определить Button.Click в файле xaml, но в CPython это невозможно.Я пытался найти ответы, но ничего не найдено.Надеюсь, вы могли бы спасти меня здесь ...

Вот мой основной сценарий:

import clr
clr.AddReference(r"wpf\PresentationFramework")
from System.IO import StreamReader
from System.Windows.Markup import XamlReader
from System.Windows import Application, Window
from System.Threading import Thread, ThreadStart, ApartmentState

class MyWindow(Window):
    def __init__(self):
        stream = StreamReader('test.xaml')
        window = XamlReader.Load(stream.BaseStream)
        Application().Run(window)

    def Button_Click(self, sender, e):
        print('Button has clicked')

if __name__ == '__main__':
    thread = Thread(ThreadStart(MyWindow))
    thread.SetApartmentState(ApartmentState.STA)
    thread.Start()
    thread.Join()

А вот и test.xmal:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="WpfApplication1" Height="300" Width="300"> 
    <Grid>
        <Button x:Name="BUTTON" Content="Button" HorizontalAlignment="Left" Margin="101,82,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click" Background="#FFFF1616"/>
    </Grid>
</Window> 

Ошибкаполученное сообщение:

Необработанное исключение: Python.Runtime.PythonException: XamlParseException: «Не удалось создать« Click »из текста« Button_Click ». 'Номер строки '6' и позиция строки '132'.

Удивительно, если я загружаю один и тот же xaml и сохраняю ту же структуру классов в IronPython, скрипт работает просто отлично:

import wpf
from System.Windows import Application, Window

class MyWindow(Window):
    def __init__(self):
        self.ui = wpf.LoadComponent(self, 'test.xaml')

    def Button_Click(self, sender, e):
        print('Button has clicked')

if __name__ == '__main__':
    Application().Run(MyWindow())

Большое спасибо за помощь!

...