Events 需要捕获一个traitsui“;“已更改标签”;事件或让Chaco初始化一个事件
我正在尝试从traitsui视图捕获“更改的选项卡”事件。我已经盘旋了一段时间,现在搜索、谷歌搜索和阅读库源代码,试图看看当用户更改UI中的哪个选项卡具有焦点时,是否会发生信号/事件,但到目前为止我还没有找到任何结果 我目前的问题是,每个选项卡都有一个Chaco图。我注意到Chaco绘图在屏幕上呈现之前不会初始化绘图宽度/高度值。我已经放弃了让绘图初始化这些值的尝试,并选择在绘图显示后简单地拉取这些值。这让我试图捕捉“标签已更改”事件 我仍然欢迎有人告诉我如何初始化Chaco绘图的宽度/高度值,但是能够捕获“更改的选项卡”事件也将非常棒 这里有一些代码来解决我的问题。 以下是我的小部件的特性视图:Events 需要捕获一个traitsui“;“已更改标签”;事件或让Chaco初始化一个事件,events,event-handling,traits,traitsui,chaco,Events,Event Handling,Traits,Traitsui,Chaco,我正在尝试从traitsui视图捕获“更改的选项卡”事件。我已经盘旋了一段时间,现在搜索、谷歌搜索和阅读库源代码,试图看看当用户更改UI中的哪个选项卡具有焦点时,是否会发生信号/事件,但到目前为止我还没有找到任何结果 我目前的问题是,每个选项卡都有一个Chaco图。我注意到Chaco绘图在屏幕上呈现之前不会初始化绘图宽度/高度值。我已经放弃了让绘图初始化这些值的尝试,并选择在绘图显示后简单地拉取这些值。这让我试图捕捉“标签已更改”事件 我仍然欢迎有人告诉我如何初始化Chaco绘图的宽度/高度值,
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)
我试图捕获的事件是当用户在两个选项卡式视图之间切换时
或者,如果我们能够初始化绘图的宽度/高度参数,也可以。绘图以以下代码生成:
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\u nav\ts.width
是我真正感兴趣的参数。但它只返回0.0
,除非已将绘图渲染到显示器中
任何帮助或见解都将不胜感激 因为我很难放弃,所以我回答了自己的问题
我知道Traitsui正在生成一个QWidget以显示在界面中。我还知道我想找到一些在顶级QWidget
中的“某处”的子QTabWidget
。通过使用“inspect”python库(非常有用!)和PySide文档,我能够生成以下代码行,允许我将“currentChanged”QTabWidget信号连接到一个方法,以便执行我想要执行的操作。这是代码:
self.ShowAnalysis.OwnWidget.findChild(QtGui.QTabWidget).currentChanged.connect(self.ShowAnalysis.handleTabChange, QtCore.Qt.QueuedConnection)
对于那些想知道这里发生了什么的人:
self.ShowAnalysis.OwnWidget
是traitsui生成的QWidget
。通过使用QWidget
方法findChild
我们可以搜索我们感兴趣的子QTabWidget
实例。在此之后,我们只需将信号连接到方法调用,以处理我们希望在“Tab Changed”事件上执行的其余操作