Доступ к встроенным ресурсам в IronPython

Я разрабатываю приложение для Windows Forms в IronPython Studio. Я хочу выбрать Icon для своего проекта, но оба они терпят неудачу: 1- Окно "Свойства формы" -> Icon (выберите файл *.ico), возникает ошибка времени компиляции и связана с файлом IronPython.targets.

Задача "IronPythonCompilerTask" неожиданно завершилась неудачей. System.ArgumentNullException: значение не может быть нулевым.

2- Я добавляю файл *.ico в Project (Project -> Add -> Existing Item) и в его свойствах меняю 'Build Action' на 'Embedded Resource', теперь я не могу использовать System.Reflection.Assembly для получения доступа к этот ресурс мой код:

self.Icon = Icon (Assembly.GetExecutingAssembly (). GetManifestResourceStream ('IronPythonWinApp.myIcon.ico'))

во время выполнения он выдает исключение:

Вызванный элемент поддерживается ботом в динамической сборке.

Кто-нибудь знает лучший (лучший?) Способ добавить значок в WinForms IronPython?

Спасибо

1 ответ

Решение

IronPython - это динамический язык сценариев; он интерпретируется во время выполнения из самих файлов сценариев, а не компилируется в сборку. Поскольку нет скомпилированной сборки, вы не можете иметь встроенный ресурс. Вот два способа добавить значок в форму в IronPython:

Во-первых, вы можете включить иконку в виде свободного файла вместе со скриптами Python. Затем можно создать объект значка, передав имя файла значка конструктору System.Drawing.Icon. Вот пример этого сценария, где основной сценарий Python и значок размещены в одном каталоге. Скрипт использует решение, найденное здесь, чтобы найти каталог.

import clr
clr.AddReference('System.Drawing')
clr.AddReference('System.Windows.Forms')

import os
import __main__
from System.Drawing import Icon
from System.Windows.Forms import Form

scriptDirectory = os.path.dirname(__main__.__file__)
iconFilename = os.path.join(scriptDirectory, 'test.ico')
icon = Icon(iconFilename)

form = Form()
form.Icon = icon
form.ShowDialog()

Кроме того, вы можете загрузить значок, который включен как встроенный ресурс в сборку.NET, например, написанную на C#.

import clr
clr.AddReference('System.Drawing')
clr.AddReference('System.Windows.Forms')

from System.Drawing import Icon
from System.Reflection import Assembly
from System.Windows.Forms import Form

assembly = Assembly.LoadFile('C:\\code\\IconAssembly.dll')
stream = assembly.GetManifestResourceStream('IconAssembly.Resources.test.ico')
icon = Icon(stream)

form = Form()
form.Icon = icon
form.ShowDialog()
Другие вопросы по тегам