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...
谢谢,
马立克
我有代码:
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...
谢谢, 马立克