Встроенный IronPython - проблема диспетчера - PullRequest
0 голосов
/ 06 июня 2011

Я попытался украсть часть кода, поставляемого с IP в действии, и, после проблем, я даже пошел на то, чтобы прочитать книгу!

Я получаю сообщение об ошибке «Ожидаем делегата, получил функцию», когда использую следующий код. К вашему сведению, я передаю ссылку на текстовое поле WPF, поэтому у меня должен быть диспетчер для моего элемента пользовательского интерфейса

Я удалил все элементы чтения потоковой трубы, чтобы оставить код теста:

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)

Любые подсказки приветствуются.

AndyF.

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Благодарю Дино Вихланда

Изменение кода диспетчера для вызова диспетчера напрямую устраняет эту проблему.

dispatcher.BeginInvoke(System.Action(lambda *_: function(*args)))

К сожалению, я больше не получаю вывод в реальном времени из своих отчетов о печати в «консоль» - все это появляется, когда скрипт завершается. Удалите диспетчер, и он возвращается в режиме реального времени ...

0 голосов
/ 10 июня 2011

Существует набор статических методов диспетчера (методов расширения) с помощью DispatcherExtensions, которые принимают Action в качестве параметра.

Пример кода ниже демонстрирует использование диспетчера WPF. Более подробная информация доступна здесь http://msdn.microsoft.com/en-us/library/cc647497.aspx

import clr
clr.AddReference('WindowsBase')
clr.AddReference('System.Windows.Presentation')
from System import Action
from System.Windows.Threading import DispatcherExtensions, Dispatcher

dispatcher = Dispatcher.CurrentDispatcher

def workCallBack():
    print 'working'

DispatcherExtensions.BeginInvoke(dispatcher, Action(workCallBack))
...