我正在将Python脚本与Pythonnet一起使用来驱动C#库。该库在某些事件上激发委托方法。我正在注册委托方法,但是没有被调用。
有问题的方法定义为event EventHandler<EventArgs> SystemInformationUpdated
有趣的是,另一个具有自定义类返回值的方法被调用,定义为event EventHandler<PeripheralDiscoveredEventArgs> PeripheralDiscovered
当我使用IronPython运行此代码时,一切正常,因此我认为这是PythonNET问题。我的代码是这样的:
from System import EventHandler, EventArgs
(...)
dc = EventHandler[PeripheralDiscoveredEventArgs](centralOnPeripheralDiscovered_callback)
central.PeripheralDiscovered += dc
iuc = EventHandler[EventArgs](systemInformationUpdated_callback)
central.SystemInformationUpdated += iuc
调用
systemInformationUpdated_callback
函数时未执行centralOnPeripheralDiscovered_callback
。我还尝试了以下代码:
from System import EventArgs
(...)
EventHandler = getattr(System, 'EventHandler`1')
dc = EventHandler[PeripheralDiscoveredEventArgs](centralOnPeripheralDiscovered_callback)
central.PeripheralDiscovered += dc
EventHandler = getattr(System, 'EventHandler`1')
iuc = EventHandler[EventArgs](systemInformationUpdated_callback)
central.SystemInformationUpdated += iuc
它也不起作用(因为我相信该错误已在PythonNET 2.2中得到纠正)。
使用控制台我得到
dc
<0, Culture=neutral, PublicKeyToken=null]]>
iuc
<0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]>
iuc
对象的Target属性是Target <__System_EventHandler`1\[\[System_EventArgs\, mscorlib\, Version=4_0_0_0\, Culture=neutral\, PublicKeyToken=b77a5c561934e089\]\]Dispatcher> __System_EventHandler`1\[\[System_EventArgs\, mscorlib\, Version=4_0_0_0\, Culture=neutral\, PublicKeyToken=b77a5c561934e089\]\]Dispatcher
我看着Python for .NET readme:Using Generics,Unable to use Generics in CPython with Python.NET,How can I get generics to work in Python.NET with CPython
环境:
Python 3.6 64位,
PythonNET 2.3.0
.NET Framework 4.5.2
Windows 7企业版64位
非常感谢!
最佳答案
经过进一步的测试,我意识到回调被调用了,对不起狼。我的回调如下:
def systemInformationUpdated_callback(sender, e):
global central
pdict = dict(central.SystemInformation)
print "System Information:"
for key, value in pdict.iteritems():
print " "+key+" = "+value
central.SystemInformation
是IDictionary<string, string>
。问题是PythonNET不会直接从它创建字典,而罪魁祸首就是这一行pdict = dict(central.SystemInformation)
但这会无声地爆炸,不会引发任何异常,并且永远不会打印
System Information:
字符串。因此,我认为该回调从未被调用过。值得注意的是,此代码可以在IronPython上正常运行。
谢谢!!