0

该程序在 chaco 3.2 中运行良好,但在 chaco 4 中,滚动条根本不显示。

我想找到问题或找到解决方法。

PanTool 可能是一种解决方法,但这会与鼠标使用的某些线光标冲突。

#!/usr/bin/env python

# Major library imports
from numpy import linspace
from scipy.special import jn

# Enthought library imports
from enthought.enable.api import Component, ComponentEditor
from enthought.traits.api import HasTraits, Instance
from enthought.traits.ui.api import Item, Group, View

# Chaco imports
from enthought.chaco.api import ArrayPlotData, VPlotContainer, \
    Plot, OverlayPlotContainer, add_default_axes, add_default_grids
from enthought.chaco.plotscrollbar import PlotScrollBar
from enthought.chaco.tools.api import PanTool, ZoomTool

#===============================================================================
# # Create the Chaco plot.
#===============================================================================
def _create_plot_component():

    # Create some x-y data series to plot
    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
    plot1 = Plot(pd)
    plot1.plot(("index", "y0", "y1", "y2"), name="j_n, n<3", color="red")[0]
    p = plot1.plot(("index", "y3"), name="j_3", color="blue")[0]

    # Add the scrollbar
    plot1.padding_top = 0

    p.index_range.high_setting = 1
    # Create a container and add our plots
    container = OverlayPlotContainer(padding = 5,fill_padding = True,
                                     bgcolor = "lightgray", use_backbuffer=True)
    hscrollbar = PlotScrollBar(component=p, mapper=p.index_mapper,axis="index", resizable="",use_backbuffer = False,
                               height=15,position=(0,0))
    hscrollbar.force_data_update()

    plot1.overlays.append(hscrollbar)


    hgrid,vgrid = add_default_grids(plot1)
    add_default_axes(plot1)
    container.add(plot1)

    container.invalidate_and_redraw()
    return container

#===============================================================================
# Attributes to use for the plot view.
size=(900,500)
title="Scrollbar example"

#===============================================================================
# # Demo class that is used by the demo.py application.
#===============================================================================
class Demo(HasTraits):
    plot = Instance(Component)

    traits_view = View(
                    Group(
                        Item('plot', editor=ComponentEditor(size=size),
                             show_label=False),
                        orientation = "vertical"),
                    resizable=True, title=title
                    )

    def _plot_default(self):
         return _create_plot_component()

demo = Demo()

if __name__ == "__main__":
    demo.configure_traits()

#--EOF---
4

1 回答 1

0

We investigated and found some problems in the code of enable api (https://github.com/enthought/enable), that had disallowed the scrollbar to display in wx backend.

The following patch solves the problem.

There are other issues, like height setting that does not work, we will continue to investigate.

diff --git a/enable/wx/scrollbar.py b/enable/wx/scrollbar.py
index 02d0da0..003cc90 100644
--- a/enable/wx/scrollbar.py
+++ b/enable/wx/scrollbar.py
@@ -136,7 +136,7 @@
     # We have to do this flip_y business because wx and enable use opposite
     # coordinate systems, and enable defines the component's position as its
     # lower left corner, while wx defines it as the upper left corner.
-        window = getattr(gc, "window", None)
+        window = getattr(self, "window", None)
     if window is None:
         return
     wx_ypos = window._flip_y(wx_ypos)
于 2016-10-12T06:56:26.840 回答