我正在尝试在TraitsUI中创建一个包含两个Mayavi数字的GUI.我根据Mayavi文档中的多个引擎示例实现了这些数字.
但是,当我向其中一个图形添加颜色条并运行GUI脚本时,除了所需的TraitsUI窗口外,它有时会打开一个空白的Mayavi场景编辑器窗口.这个空白窗口并不总是出现,从不在重新启动python内核后的第一次运行,有时只是在连续几次运行脚本并关闭每次出现的窗口之后.
运行下面大大减少的代码会产生相同的行为,删除该mlab.colorbar(s)
行可以解决问题.如何在不打开空白窗口的情况下获得彩条?对于表面图,似乎没有明显的方法将颜色条指定给特定的图形.我在Windows 7上运行Python 3.5(但在Ubuntu上遇到相同的问题).
from traits.api import HasTraits, Instance, on_trait_change
from traitsui.api import View, Item
import numpy as np
from mayavi.core.api import Engine
from mayavi.core.ui.api import SceneEditor, MlabSceneModel
from mayavi import mlab
#Generate a test surface to display
def test_surf():
x, y = np.mgrid[-7.:7.05:0.1, -5.:5.05:0.05]
z = np.sin(x + y) + np.sin(2 * x - y) + np.cos(3 * x + 4 * y)
return x, y, z
class MyApp(HasTraits):
#Create a mayavi scene with …
Run Code Online (Sandbox Code Playgroud) 使用以下程序:
from traits.api import HasTraits, Int, Instance
from traitsui.api import View
class NewView(View):
def __del__(self):
print('deleting NewView')
class A(HasTraits):
new_view = Instance(NewView)
def __del__(self):
print('deleting {}'.format(self))
a = Int
def default_traits_view(self):
new_view = NewView('a')
return new_view
Run Code Online (Sandbox Code Playgroud)
赛跑
a = A()
del(a)
Run Code Online (Sandbox Code Playgroud)
回报
deleting <__main__.A object at 0x12a016a70>
Run Code Online (Sandbox Code Playgroud)
正如它应该.
如果我做
a = A()
a.configure_traits()
Run Code Online (Sandbox Code Playgroud)
关闭对话框后:
del(a)
Run Code Online (Sandbox Code Playgroud)
我有同样的信息:
deleting <__main__.A object at 0x12a016650>
Run Code Online (Sandbox Code Playgroud)
没有提到要删除的NewView.
在Geneal中,使用Traits和TraitsUI避免内存泄漏的良好做法是什么?
我正在使用Python的traits包,我正在试图找出使用traits.trait_numeric.Array类的正确方法.使用数组特征编写traits.api.HasTraits的子类是很简单的,这样当数组更改时,会触发on_trait_change,但是我无法弄清楚当数组元素被修改时如何触发任何类型的事件到位.这是一个最小的例子:
from traits.api import HasTraits
from traits.trait_numeric import Array
import numpy as np
class C(HasTraits):
x = Array
def __init__(self):
self.on_trait_event(self.do_something, 'x')
def do_something(self):
print 'Doing something'
c = C()
# This line calls do_something()
c.x = np.linspace(0,1,10)
# This one doesn't, and I wish it did
c.x[3] = 100
# Same with this one
c.x[:] = np.ones(c.x.shape)
Run Code Online (Sandbox Code Playgroud)
我希望有一些内置的traits.trait_numeric.Array功能,我不知道,因为检测到数组的一部分已经改变似乎是一个非常标准的事情.
除此之外,我认为这个问题可以通过创建一个自定义特征类来解决,该类也继承了numpy.array,然后更改[]运算符,以便它显式触发正确类型的特征事件.但希望这是一种蠕虫,我不必打开.
我要做的就是继承两个不同的类.
from traits.api import HasTraits
from PyQt4 import QtCore, QtGui, uic
class Main_Excel_Class(HasTraits,QtGui.QMainWindow):
pass
Run Code Online (Sandbox Code Playgroud)
我有"元类冲突:派生类的元类必须是其所有基础元类的(非严格)子类"
最初错误.但我通过输入__ 元类 __属性来解决它:
from traits.api import HasTraits
from PyQt4 import QtCore, QtGui, uic
class Main_Excel_Class_Meta(type(HasTraits), type(QtGui.QMainWindow)):
pass
class Main_Excel_Class(HasTraits,QtGui.QMainWindow):
__metaclass__ = Main_Excel_Class_Meta
Run Code Online (Sandbox Code Playgroud)
但现在我最终得到了
"TypeError: Error when calling the metaclass bases
multiple bases have instance lay-out conflict"
Run Code Online (Sandbox Code Playgroud)
错误.我试着调查其他类似的问题,但我老实说不太了解.如何解决这个问题的任何见解将非常感激.谢谢
我在尝试动态初始化Traits Range对象时遇到了麻烦.
下面的代码是我正在尝试做的一个非常简单的示例,但遗憾的是出现以下类型错误:
TypeError:不支持的操作数类型 - :'int'和'code'
from traits.api import HasTraits, Int, Range
from traitsui.api import View, Item
class DynamicRange(HasTraits):
"""Dynamic initialisation of a Range object"""
N = Int()
R = Range(low=0, high='N')
traits_view = View(Item('R'), Item('N'))
def __init__(self, N):
self.N = N # initial parameter value for N
def _N_default(self):
return self.N
Robject = DynamicRange(N=10)
Robject.configure_traits()
Run Code Online (Sandbox Code Playgroud)
如果我用'R = Range(低= 0,高= 10)替换'R'的定义,代码就有效,但当然我没有得到我正在寻找的Range高参数的动态初始化.
感谢所有建议.
*乔纳森回应后编辑*
以下是使用Jonathan的有用建议解决我问题的简单方法:
from traits.api import HasTraits, Range
from traitsui.api import View, Item
class DynamicRange(HasTraits):
"""Dynamic …
Run Code Online (Sandbox Code Playgroud) from traits.api import Str
class Foo(HasTraits):
a=Str
b=Str()
Run Code Online (Sandbox Code Playgroud)
成员'a'和'b'之间是否有任何行为差异?
特质属性总是特定于实例,还是属于类成员?
我最近发现了Enaml,一个来自Enthought的Python GUI开发包.我非常有兴趣将它与Enthought Traits和Chaco一起用于更快速的科学应用开发.我一直在使用Python(x,y)作为我的基础Python安装,因为我喜欢Spyder(熟悉来自Matlab背景)我最初的目标是构建一个PyQt应用程序.
Python(x,y)附带了Enthought Tool Suite,它似乎包含了大部分Enthought内部开发的工具,如Traits,Chaco,Mayavi和Enaml.我在enaml上看到了pygotham幻灯片,并找到了看起来非常酷的教程示例!但是,当我尝试运行第一个示例时,我收到此错误:
回溯(最近调用最后一次):文件"C:\ Users\bnables\Documents\Python\enaml\person.py",第8行,来自enaml.stdlib.sessions import simple_session ImportError:没有名为sessions的模块
我刚刚发现我全新安装的Python(x,y)2.7.3.1有Enthought Tool Suite版本4.2和Enaml版本0.2 ......在线Enaml文档版本高达0.6.3版本.所以我想我的问题是 - Python(x,y)用户使用Enaml的最佳途径是什么?
我试图避免直接使用Enthought Python Distribution,因为我在工作中使用它并且没有购买付费版本的权限或资金.可以从Enthought源存储库更新内置于Python(x,y)中的Enthought工具套件吗?Enaml本身可以单独更新吗?
Enthought伙计们,我带你了解你最近宣布正式支持Stack Overflow问题!谢谢!
我在TraitsUI包中遇到了TabularAdapter的问题......
我一直想在自己身上花很长时间来解决这个问题,所以我想请各位专家提供一些友好的建议:)
我要添加一个我的程序来说明我的问题,我希望有人可以看一遍并说'啊哈!......这是你的问题'(我的手指交叉).
基本上,我可以使用TabularAdapter将表编辑器生成为dtypes数组,除了以下情况之外它工作得很好:
1)每当我更改元素数量(标识为'破裂数:')时,数组都会调整大小,但是在我单击其中一个元素之前,该表不会反映更改.我想要发生的是,在我释放#of fractures滑块后,#行(骨折)发生了变化.这可行吗?
2)我遇到的第二个问题是,如果数组在由.configure_traits()显示之前调整大小(通过Notifier,当Number_of_fractures被修改时),我可以缩小数组的大小,但我无法增加它新尺寸.
2b)我以为我找到了一种让表格编辑器显示完整数组的方法,即使它在代码中的5个集合上增加(在调用.trait_configure()之前),但我被骗了:(我尝试添加另一个在vertical_fracture_group前面的Group()所以表格不是第一个显示的东西.这更接近模仿我的整个程序.当我这样做时,我被锁定在新的较小尺寸的数组中,我不能再将其大小增加到最大值15.我正在修改代码以反映此问题.
这是我的示例代码:
# -*- coding: utf-8 -*-
"""
This is a first shot at developing a ****** User Interface using Canopy by
Enthought. Canopy is a distribution of the Python language which has a lot of
scientific and engineering features 'built-in'.
"""
#-- Imports --------------------------------------------------------------------
from traitsui.api import TabularEditor
from traitsui.tabular_adapter import TabularAdapter
from numpy import zeros, dtype
from traits.api import HasTraits, Range
from traitsui.api import View, Group, Item
#-- FileDialogDemo Class ------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud) traitsui ×8
enthought ×6
python ×5
arrays ×1
editor ×1
epd-python ×1
mayavi ×1
numpy ×1
pyqt ×1
python-2.7 ×1
python-3.x ×1
pythonxy ×1
range ×1
traits ×1