8

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')

QWidget から継承する Chaco/Enthought クラスは?

4

4 に答える 4

8

今日これを見たばかりです。WX と同様に Qt 内に Chaco を組み込むことは絶対に可能であり、かなり簡単です。実際、ETS_TOOLKIT 環境変数を「qt4」に設定して実行すると、すべての例がまさにこれを実行します。(Chacoでは、基礎となる GUI ツールキットが必要です。)

コード テンプレートの空白を埋める小さなスタンドアロンの例を作成し、Qt ウィンドウ内に chaco Plot を埋め込む方法を示します。

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()
于 2010-02-11T23:40:36.553 に答える
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 から継承します

于 2010-01-27T23:17:07.737 に答える
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 と対話します。

于 2010-01-27T20:48:18.267 に答える
-1

私はチャコを知りませんが、簡単に見てみると、これは不可能であることがわかります.

Chaco と PyQt はどちらも、ユーザーと対話するように設計されたグラフィカル ツールキットです。Chaco はプロット指向で、PyQt はよりアプリケーション指向です。それぞれに、ウィンドウとは何か、ユーザーのクリックを検出する方法、ペイント イベントを処理する方法などを管理する独自の方法があり、それらが混ざり合わないようにします。

プロット ソフトウェアが必要な場合は、matplotlib を使用してグラフの静的画像を生成し、PyQt で画像を表示することができます。または、PyQt ベースのグラフまたはプロット ツールキットを試してください。

于 2010-01-27T16:59:33.220 に答える