Нужно либо захватить событие traitsui «измененная вкладка», либо Chaco инициализировать размеры графиков - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь запечатлеть событие «измененная вкладка» из представления traitsui.Некоторое время я кружил в поиске, поиске в Google и чтении исходного кода библиотеки, пытаясь увидеть, есть ли сигнал / событие, которое происходит, когда пользователи изменяют, какая вкладка имеет фокус в пользовательском интерфейсе, но я пока ничего не придумал..

У меня сейчас проблема в том, что каждая вкладка содержит график Чако.Я заметил, что графики Чако не инициализируют значения ширины / высоты графиков, пока они не отобразятся на экране.Я отказался от попыток инициализировать эти значения графиками и решил просто извлекать их после отображения графиков.Что заставляет меня пытаться захватить событие «вкладки изменились».

Я все еще открыт для того, чтобы кто-нибудь говорил мне, как я могу инициализировать значения ширины / высоты графика Чако, но могу захватитьСобытие «измененная вкладка» также было бы фантастическим.

Вот код, который поможет решить мою проблему.Вот вид черт для моего виджета:

traits_view = View(
            Tabbed(
            Group(
                Item('FFT_Container',editor=ComponentEditor(), show_label=False),
            label='Fourier Spectrum', id='FFTPlot'),
            Group(
                VGroup(
                    Item('TS_Container',editor=ComponentEditor(), show_label=False),
                    Item('NAV_Container', editor=ComponentEditor(), show_label=False, height=100)
                ),
            label='Time Series', id='TSPlot')
            ),
            spring,
            HGroup(
            Item('SonicationUI', show_label=True, label='Sonication:'),
            Item('BurstNumberUI', show_label=True, label = 'Burst:'),
            Item('PeakNumberUI', show_label=True, label = 'Peak:'),
            Item('FrequencyRange', show_label=True, label = 'Freq. range'),
            Item("triggerPDB", show_label=False)),
            resizable=True)

Я пытаюсь захватить событие, когда пользователи переключаются между двумя Tabbed представлениями.

В качестве альтернативы, если мывозможность инициализировать параметры ширины / высоты графиков, которые также будут работать.Графики построены в следующем коде:

        self.FFT_Container = OverlayPlotContainer(  padding = 50,
                                                    valign='center',
                                                    halgin='right',
                                                    use_backbuffer = True)

        self.TS_Container  = OverlayPlotContainer(  padding = 50,
                                                    valign='center',
                                                    halgin='right',
                                                    use_backbuffer = True)

        self.NAV_Container = OverlayPlotContainer(  padding = 10,
                                                    valign='bottom',
                                                    halign='center',
                                                    use_backbuffer = True)


        self.data_fft       = np.zeros(1)
        self.data_fft_freq  = np.zeros(1)

        self.data_time      = np.zeros(1)
        self.data_voltage   = np.zeros(1)

        self.data_nav_time  = np.zeros(1)
        self.data_nav_volts = np.zeros(1)

        #2019-01-24 CK: a dictionary to reference the plot data.
        self.dataPointers           = {}
        self.dataPointers['FFT']    = {'frequency':self.data_fft_freq,'spectrum':self.data_fft}
        self.dataPointers['Time']   = {'timeVector':self.data_time,'voltageVector':self.data_voltage}
        self.dataPointers['NAV']    = {'navTime':self.data_nav_time,'navVoltage':self.data_nav_volts}
        self.dataPointers['Index']  = {'Start':self.StartIndex,'Stop':self.StopIndex}

        self.plot_fft                   = create_line_plot((self.data_fft_freq, self.data_fft), color=self.ColorsPlot[0], bgcolor="black", add_grid = True, add_axis = True)
        self.plot_ts                    = create_line_plot((self.data_time, self.data_voltage), color=self.ColorsPlot[0], bgcolor="black", add_grid = True, add_axis = True)
        self.plot_nav_ts                = create_line_plot((self.data_nav_time, self.data_nav_volts), color=self.ColorsPlot[0], bgcolor="black")

        self.plot_fft.use_downsampling      = True
        self.plot_ts.use_downsampling       = True
        self.plot_nav_ts.use_downsampling   = True

        self.plot_fft.x_axis.title      = 'Frequency (Hz)'
        self.plot_fft.y_axis.title      = 'Volts (V)'

        self.plot_ts.x_axis.title       = 'Time ('+unichr(956)+'s)'
        self.plot_ts.y_axis.title       = 'Volts (mV)'

        self.listener                   = PlotListener( pUpdatePlot = self.updatePlot,
                                                        pBounds = self.plot_nav_ts.index.get_bounds(),
                                                        data=self.dataPointers)
        self.plot_nav_ts.active_tool    = RangeSelection(self.plot_nav_ts, left_button_selects=True)

        self.plot_nav_ts.active_tool.listeners.append(self.listener)
        self.plot_nav_ts.overlays.append(RangeSelectionOverlay(component=self.plot_nav_ts))

        self.pan_fft                    = PanTool(component=self.plot_fft,drag_button='left')
        self.pan_ts                     = PanTool(component=self.plot_ts, drag_button='left')

        self.zoom_fft                   = BetterSelectingZoom(component=self.plot_fft, tool_mode="box", always_on=False)
        self.zoom_ts                    = BetterSelectingZoom(component=self.plot_ts, tool_mode="range", axis='index', always_on=False)

        self.plot_fft.tools.append(self.pan_fft)
        self.plot_fft.overlays.append(self.zoom_fft)

        self.plot_ts.tools.append(self.pan_ts)
        self.plot_ts.overlays.append(self.zoom_ts)

, где self.plot_nav_ts.width - это параметр, который меня действительно интересует. Но он просто возвращает 0.0, если график не отображается на дисплее.

Любая помощь или понимание будут оценены!

1 Ответ

0 голосов
/ 25 января 2019

Поскольку мне трудно сдаться, я ответил на свой вопрос.

Я знал, что Traitsui генерирует QWidget для отображения в интерфейсе. Я также знал, что хочу найти какого-нибудь ребенка QTabWidget, который "где-то" внутри верхнего уровня QWidget. используя библиотеку python «inspect» (довольно полезно!) и документацию PySide, я смог создать следующую строку кода, которая позволила мне подключить сигнал «currentChanged» QTabWidget к методу, чтобы я мог выполнить то, что хотел сделать , Вот этот код:

self.ShowAnalysis.OwnWidget.findChild(QtGui.QTabWidget).currentChanged.connect(self.ShowAnalysis.handleTabChange, QtCore.Qt.QueuedConnection)

Для тех, кто хочет знать, что здесь происходит:

self.ShowAnalysis.OwnWidget - это QWidget, который производит traitsui. Используя QWidget метод findChild, мы можем искать интересующий дочерний экземпляр QTabWidget. После этого мы просто подключаем сигнал к вызову метода для обработки остальных действий, которые мы хотим выполнить. выполнить после события «Tab Changed».

...