2010-01-27 4 views
8

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

Часы поисков мало (search for yourself). До сих пор я понял, что мне нужно следующие строки:

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

я не смог найти PyQt4-Чако код в любом месте на интернетах

я был бы очень благодарен любой заполняя пробелы, чтобы показать мне возможный простой участок (с 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?

ответ

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

+3

ПРИМЕЧАНИЕ: строка 'app = QtGui.QApplication (sys.argv)' должна появиться перед любым импортным импортом –

+1

@bandana: correct. отредактировал мой ответ – bandana

-1

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

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

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

+0

я найти Matplotlib 1. слишком медленно для моих потребностей 2. не как 'интерактивная поддержка', как Чако 3. изворотливого в своей конструкции. –

+0

Я знаю, что Chaco может работать с PyQt (и wx). К сожалению, у Chaco нет хорошей документации по этому предмету и других. –

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. Фактически, все примеры, когда они запускаются со средой var ETS_TOOLKIT, установленной в «qt4», делают именно это. (Чако требует там быть основной GUI инструментарий.)

Я написал небольшой, автономный пример, который заполняет пробелы в шаблоне кода, и показывает, как встроить Чако Plot внутри 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()