Thank you Dino modifying my Python dispatcher to read
dispatcher.BeginInvoke(System.Action(lambda *_: function(*args))) fixed the problem. Unfortunately for me, utilising the dispatcher has an unforseen side effect - the 'messages' printed to my console only appear when the python script exits. If I revert the code to bypass all dispatcher code i.e. use the following def write(self, string): self.texbox.AppendText(string) then I see the messages arrive in real time. I have tested launching my PythonEngine class using a thread with both ApartmentState.STA and MTA but this has no discernible effect. Can you offer any explanation, maybe workaround? Thanks AndyF. Dino Viehland wrote: > > AndyF wrote: >> Hi Chaps >> >> I have attempted to purloin some of the code shipped with IP in Action >> and, >> following issues, I have even gone to the lengths of reading the book! >> >> I am getting the error 'expect Delegate, got Function' when I use the >> following code. FYI I am passing in a reference to a WPF textBox so I >> should >> have a dispatcher on my UI element >> >> I have removed all of the threading pipe reading stuff just to leave >> 'test' >> code: >> >> import System >> import System.IO >> import Avacta.Optim.Server.WebServices >> import Avacta.Optim.Server.DataModel >> import sys >> import clr >> import time >> >> from System import Console >> from System.Threading import Thread, ThreadStart >> >> def SetDispatcher(ui_element): >> global dispatcher # needed else "Exception: 'NoneType' object has no >> attribute 'BeginInvoke'" >> dispatcher = ui_element.Dispatcher >> >> def Dispatch(function, *args): >> dispatcher.BeginInvoke(lambda *_: function(*args)) >> >> def GetDispatchFunction(function): >> return lambda *args: Dispatch(function, *args) >> >> class ListOutput: >> def __init__(self, textbox): >> self.textbox = textbox >> >> def write(self, string): >> Dispatch(self.addText, string) # error: "expect Delegate, got Function" >> # self.addText(string) # ok works fine w-w/o dispatcher stuff >> >> def addText(self, string): >> textbox.AppendText(string) >> >> if textbox != None: >> listout = ListOutput(textbox) >> sys.stdout = listout >> SetDispatcher(textbox) >> >> print "Define running" >> #running = True >> >> Thread.Sleep(0) >> time.sleep(2) >> >> print "Start The Comms Thread..." >> #comms_t = Thread(ThreadStart(run_comms)) >> #comms_t.Start() >> >> Thread.Sleep(0) >> time.sleep(2) >> >> Any clues would be greatly appreciated! > > The WPF invocation functions just take a type which is typed to "Delegate" > instead of a type of a specific delegate. Therefore we don't know what > type > of delegate to create for you automatically. Instead you can convert the > Python function into a delegate by calling the delegate type directly, > e.g.: > > dispatcher.BeginInvoke(System.Action(lambda *_: function(*args))) > > or you can use another delegate type (e.g. System.Action[object]) with the > appropriate signature you need. > > > _______________________________________________ > Users mailing list > Users@lists.ironpython.com > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > > -- View this message in context: http://old.nabble.com/Dispatcher-Problem-tp31782357p31789855.html Sent from the IronPython mailing list archive at Nabble.com. _______________________________________________ Users mailing list Users@lists.ironpython.com http://lists.ironpython.com/listinfo.cgi/users-ironpython.com