Python: встроить Чако в тайну PyQt4 - PullRequest
8 голосов
/ 27 января 2010

Как мне добавить Chaco в существующее приложение PyQt4?

Часы поиска дали мало ( ищи себя ). Пока я понял, что мне нужны следующие строки:

import os
os.environ['ETS_TOOLKIT']='qt4'

я не смог найти код PyQt4-Chaco в интернете

Я был бы очень признателен всем, кто заполняет пробелы, чтобы показать мне простейший линейный сюжет (с 2 точками)

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 ]

8 голосов
/ 12 февраля 2010

Я только что видел это сегодня. Вполне возможно и довольно просто встроить Chaco в Qt, а также в WX. Фактически, все примеры, когда запускаются с переменной среды ETS_TOOLKIT, установленной в "qt4", делают именно это. (Chaco требует , чтобы быть базовым инструментарием GUI.)

Я написал небольшой автономный пример, который заполняет пробелы в шаблоне кода и демонстрирует, как встроить график Чако в окно Qt.

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()
7 голосов
/ 28 января 2010

вот что вам нужно:

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

0 голосов
/ 27 января 2010

Я не знаю о Чако, но я использую 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.

0 голосов
/ 27 января 2010

Я не знаю Чако, но быстрый взгляд говорит мне, что это невозможно.

И Chaco, и PyQt являются графическими инструментами, разработанными для взаимодействия с пользователем. Chaco ориентирован на сюжет, а PyQt более ориентирован на приложения. Каждый из них имеет свой собственный способ управления тем, что такое окно, как определять щелчки пользователей, как обрабатывать события рисования, ... чтобы они не смешивались.

Если вам нужно программное обеспечение для черчения, вы можете попробовать использовать matplotlib для генерации статических изображений графика и отображения изображения в PyQt. Или попробуйте PyQt на основе графика или графического инструментария.

...