Доступ к встроенным ресурсам в 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()