Нужно либо захватить событие traitsui "измененная вкладка", либо Chaco инициализировать размеры графиков
Я пытаюсь захватить событие "измененная вкладка" из представления 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 ответ
Поскольку мне трудно сдаться, я ответил на свой вопрос.
Я знал, что 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".