How do i go about adding Chaco to an existing PyQt4 application?
Hours of searches yielded little (search for yourself). So far i've figured i need the following lines:
import os
os.environ['ETS_TOOLKIT']='qt4'
i could not find PyQt4-Chaco code anywhere on the internets
i would be very grateful to anyone filling in the blanks to show me the simplest line plot possible (with 2 points)
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')
what Chaco/Enthought class inherits from QWidget ?
I just saw this today. It is absolutely possible and fairly straightforward to embed Chaco inside Qt as well as WX. In fact, all of the examples, when run with your ETS_TOOLKIT environment var set to "qt4", are doing exactly this. (Chaco requires there to be an underlying GUI toolkit.)
I have written a small, standalone example that fills in the blanks in your code template, and demonstrates how to embed a chaco Plot inside a Qt Window.
qt_example.py:
"""
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()
here is what you need:
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 inherits from QWidget
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With