traits ui (enthought) 和来自 C 的回调

traits ui (enthought) and callback from C

我有代码:

import time
import numpy as np
from scipy.optimize import fmin_tnc
from enthought.traits.api import *
from enthought.traits.ui.api import *

class Minimizer(HasTraits):
    iteration = Int(0)
    run = Button

    def callback(self, x):
        self.iteration += 1
        print self.iteration
        time.sleep(0.5)

    def func(self, x):
        return (x**2).sum()

    def fprime(self, x):
        return 2*x

    def minimize(self):
        x0 = np.random.rand(50)
        fmin_tnc(self.func, x0, fprime=self.fprime, messages=0, callback = self.callback) 

    def _run_fired(self):
        self.minimize()

    traits_view = View(Item('iteration'), UItem('run'))

m = Minimizer()
m.configure_traits()

在上述 运行 之后按下 运行 按钮,我预计 'iteration' 属性将在每次迭代时在 GUI 中更新,但事实并非如此。我怀疑这是因为这个值被 C 的回调改变了。在这种情况下应该如何更新用户界面?

此致, 马立克

m.configure_traits() 的调用正在阻塞,这意味着您的脚本将不会继续执行超过该行,直到您关闭该调用创建的 window。换句话说,m.minimize 在 window 打开时不会被调用。

我找到了解决方案。简单地说,'minimize' 方法必须是非阻塞的,因此在单独的线程中实现最小化,如下所示:

def minimize(self):
    x0 = np.random.rand(50)
    #fmin_tnc(self.func, x0, fprime=self.fprime, messages=0, callback = self.callback) 
    import thread
    thread.start_new_thread(fmin_tnc, (self.func, x0), {'fprime':self.fprime, 'messages':0, 'callback':self.callback})

将导致实时更新 UI...

谢谢, 马立克