Python:在PyQt4中嵌入Chaco的疑问
我该如何在一个已经存在的PyQt4应用程序中添加Chaco呢?
我花了好几个小时搜索,结果却没找到什么有用的信息(你也可以自己搜索一下)。到目前为止,我发现我需要以下几行代码:
import os
os.environ['ETS_TOOLKIT']='qt4'
我在网上找不到任何关于PyQt4-Chaco的代码。
如果有人能帮我填补这些空白,给我展示一个最简单的折线图(包含两个点),我将非常感激。
from PyQt4 import QtCore, QtGui
import sys
import os
os.environ['ETS_TOOLKIT']='qt4'
from enthought <blanks>
:
:
app = QtGui.QApplication(sys.argv)
main_window = QtGui.QMainWindow()
main_window.setCentralWidget(<blanks>)
main_window.show()
app.exec_()
print('bye')
Chaco/Enthought中哪个类是从QWidget继承的呢?
4 个回答
0
我对Chaco不太了解,不过我在用VTK。这里有段代码可以用来画一些线,这些线有它们的(x,y,z)坐标。
"""Define an actor and its properties, to be drawn on the scene using 'lines' representation."""
ren = vtk.vtkRenderer()
apd=vtk.vtkAppendPolyData()
for i in xrange(len(coordinates)):
line=vtk.vtkLineSource()
line.SetPoint1(coordinates[i][0]) # 1st atom coordinates for a given bond
line.SetPoint2(coordinates[i][1]) # 2nd atom coordinates for a given bond
line.SetResolution(21)
apd.AddInput(line.GetOutput())
mapper = vtk.vtkPolyDataMapper()
mapper.SetInput(apd.GetOutput())
lines_actor = vtk.vtkActor()
lines_actor.SetMapper(mapper)
lines_actor.GetProperty().SetColor(colorR, colorG, colorB)
lines_actor.GetProperty().SetOpacity(opacity)
# Add newly created actor to the renderer.
self.ren.AddViewProp(actor) # Prop is the superclass of all actors, composite props etc.
# Update renderer.
self.ren.GetRenderWindow().Render()
这段代码使用了QVTKRenderWindowInteractor来和PyQT4进行互动。
8
我今天刚看到这个。其实,把Chaco嵌入到Qt或者WX中是完全可能的,而且相对简单。实际上,当你设置好ETS_TOOLKIT这个环境变量为"qt4"时,所有的示例都是在做这个事情。(Chaco 需要一个底层的图形用户界面工具包。)
我写了一个小的独立示例,填补了你代码模板中的空白,并演示了如何在Qt窗口中嵌入一个Chaco图。
"""
Example of how to directly embed Chaco into Qt widgets.
The actual plot being created is drawn from the basic/line_plot1.py code.
"""
import sys
from numpy import linspace
from scipy.special import jn
from PyQt4 import QtGui, QtCore
from enthought.etsconfig.etsconfig import ETSConfig
ETSConfig.toolkit = "qt4"
from enthought.enable.api import Window
from enthought.chaco.api import ArrayPlotData, Plot
from enthought.chaco.tools.api import PanTool, ZoomTool
class PlotFrame(QtGui.QWidget):
""" This widget simply hosts an opaque enthought.enable.qt4_backend.Window
object, which provides the bridge between Enable/Chaco and the underlying
UI toolkit (qt4). This code is basically a duplicate of what's in
enthought.enable.example_support.DemoFrame, but is reproduced here to
make this example more stand-alone.
"""
def __init__(self, parent, **kw):
QtGui.QWidget.__init__(self)
def create_chaco_plot(parent):
x = linspace(-2.0, 10.0, 100)
pd = ArrayPlotData(index = x)
for i in range(5):
pd.set_data("y" + str(i), jn(i,x))
# Create some line plots of some of the data
plot = Plot(pd, title="Line Plot", padding=50, border_visible=True)
plot.legend.visible = True
plot.plot(("index", "y0", "y1", "y2"), name="j_n, n<3", color="red")
plot.plot(("index", "y3"), name="j_3", color="blue")
# Attach some tools to the plot
plot.tools.append(PanTool(plot))
zoom = ZoomTool(component=plot, tool_mode="box", always_on=False)
plot.overlays.append(zoom)
# This Window object bridges the Enable and Qt4 worlds, and handles events
# and drawing. We can create whatever hierarchy of nested containers we
# want, as long as the top-level item gets set as the .component attribute
# of a Window.
return Window(parent, -1, component = plot)
def main():
app = QtGui.QApplication(sys.argv)
main_window = QtGui.QMainWindow(size=QtCore.QSize(500,500))
enable_window = create_chaco_plot(main_window)
# The .control attribute references a QWidget that gives Chaco events
# and that Chaco paints into.
main_window.setCentralWidget(enable_window.control)
main_window.show()
app.exec_()
if __name__ == "__main__":
main()
7
你需要了解的是:
import os, sys
os.environ['ETS_TOOLKIT'] = 'qt4'
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
from numpy import linspace, pi, sin
from enthought.enable.api import Component, Container, Window
from enthought.chaco.api import create_line_plot, \
add_default_axes, \
add_default_grids, \
OverlayPlotContainer
x = linspace(-pi,pi,100)
y = sin(x)
plot = create_line_plot((x,y))
add_default_grids(plot)
add_default_axes(plot)
container = OverlayPlotContainer(padding = 50)
container.add(plot)
plot_window = Window(None, -1, component=container)
plot_window.control.setWindowTitle('hello')
plot_window.control.resize(400,400)
plot_window.control.show()
app.exec_()
plot_window.control 是从 QWidget 这个类继承过来的。