matlab user-interface tabs visibility matlab-guide

Pestañas optimizadas en la GUI de MATLAB



user-interface tabs (3)

Tal vez si pones los mangos en una matriz. De esa manera no tienes que pasar por cada uno de ellos. Esto me parece rápido, pero "rápido" puede significar muchas cosas :)

Eliminé algunas de las propiedades para que el ejemplo sea más corto ...

function test(N) % N is the number of tabs if nargin == 0 N = 3; end % Figure handles.figure_window = figure(... ''Units'',''characters'',... ''Position'',[50 50 80 25]); % Buttons handles.tab_panel = uibuttongroup(... ''Parent'',handles.figure_window,... ''Units'',''characters'',... ''Position'',[0 23 80 2]); alpha = ''ABCDEFGHIJKLMNOPQRSTUVXYZ''; for i_tab=1:N % button handles.tabs(i_tab) = uicontrol(... ''Parent'',handles.tab_panel,... ''Units'',''characters'',... ''Position'',[80/N*(i_tab-1) 0 80/N 2],... ''Style'',''togglebutton'',... ''String'',[''Tab '' alpha(i_tab)]); % Panel i handles.panels(i_tab) = uipanel(... ''Parent'',handles.figure_window,... ''Units'',''characters'',... ''Position'',[0.1 0 79.8 23],... ''Visible'',''Off''); handles.panel_a_text = uicontrol(... ''Parent'',handles.panels(i_tab),... ''Units'',''characters'',... ''Position'',[0 0 77 22],... ''Style'',''text'',... ''String'',[''This is the tab '', alpha(i_tab)]); end % set callback for all buttons set(handles.tabs, ''callback'', {@tab_example_callback handles}) % choose tab 1 as active set(handles.panels(1), ''Visible'',''On''); guidata(handles.figure_window, handles); function tab_example_callback(hObject,eventdata,handles) % set everything invisible set(handles.panels,''Visible'',''Off''); % turn on selected panel set(handles.panels(handles.tabs == hObject), ''Visible'',''On''); guidata(handles.figure_window, handles);

¿Eso te ayuda?

Estoy trabajando en una GUI en MATLAB y uso pestañas para organizar la información. Como las pestañas no son compatibles con MATLAB GUIDE, simplemente creo varios uipanel y cambio su campo ''Visible'' . Sin embargo, cuando el número de controles dentro de cada panel es grande, toma un tiempo cambiar entre paneles. ¿Alguien sabe una forma de hacer que el cambio de pestañas sea más rápido?

Incluyo un ejemplo simple de la interfaz basada en pestañas.

tab_example_gui.m

% Figure handles.figure_window = figure(... ''Units'',''characters'',... ''Tag'',''figure_window'',... ''Position'',[50 50 80 25],... ''Name'',''Tab Example'',... ''DockControls'',''off'',... ''IntegerHandle'',''off'',... ''MenuBar'',''none'',... ''NumberTitle'',''off'',... ''Resize'',''off''); % Buttons handles.tab_panel = uibuttongroup(... ''Parent'',handles.figure_window,... ''Tag'',''tab_panel'',... ''Units'',''characters'',... ''Position'',[0 23 80 2],... ''SelectionChangeFcn'',@(hObject,eventdata)tab_example_callback(hObject,eventdata,guidata(hObject)),... ''BorderType'',''none''); handles.tab_a = uicontrol(... ''Parent'',handles.tab_panel,... ''Tag'',''tab_a'',... ''Units'',''characters'',... ''Position'',[0 0 40 2],... ''Style'',''togglebutton'',... ''String'',''Tab A''); handles.tab_b = uicontrol(... ''Parent'',handles.tab_panel,... ''Tag'',''tab_b'',... ''Units'',''characters'',... ''Position'',[40 0 40 2],... ''Style'',''togglebutton'',... ''String'',''Tab B''); % Panel A handles.panel_a = uipanel(... ''Parent'',handles.figure_window,... ''Tag'',''panel_menu'',... ''Units'',''characters'',... ''Position'',[0.1 0 79.8 23],... ''Visible'',''On''); handles.panel_a_text = uicontrol(... ''Parent'',handles.panel_a,... ''Tag'',''panel_menu_load_id_text'',... ''Units'',''characters'',... ''Position'',[0 0 77 22],... ''Style'',''text'',... ''String'',''This is the tab A''); % Panel B handles.panel_b = uipanel(... ''Parent'',handles.figure_window,... ''Tag'',''panel_menu'',... ''Units'',''characters'',... ''Position'',[0.1 0 79.8 23],... ''Visible'',''Off''); handles.panel_b_text = uicontrol(... ''Parent'',handles.panel_b,... ''Tag'',''panel_menu_load_id_text'',... ''Units'',''characters'',... ''Position'',[0 0 77 22],... ''Style'',''text'',... ''String'',''This is the tab B''); guidata(handles.figure_window, handles);

tab_example_callback.m

function tab_example_callback(hObject,eventdata,handles) switch get(get(hObject,''SelectedObject''),''Tag'') case ''tab_a'', set(handles.panel_a,''Visible'',''On''); set(handles.panel_b,''Visible'',''Off''); case ''tab_b'', set(handles.panel_a,''Visible'',''Off''); set(handles.panel_b,''Visible'',''On''); end guidata(handles.figure_window, handles); end

Nota: La GUI es para introducir parámetros para una simulación en 5 pestañas. En cada pestaña, tengo alrededor de 15 filas; y cada fila tiene un text , una checkbox y tres edit . No parece estar superpoblado para mí. Además, hice el diseño y las devoluciones de llamadas por mi cuenta con la cantidad mínima de código y gastos generales. Pero, todavía tiene transiciones de tabulación muy molestas.


Recomiendo encarecidamente que, si está creando una GUI de cualquier complejidad, eche un vistazo a GUI Layout Toolbox , y no use GUIDE, simplemente no es adecuado para crear GUI complejas (eso no es una crítica, es solo que es solo diseñado para hacer GUIs rápidas y simples).

GUI Layout Toolbox hace que sea mucho más fácil crear GUIs profesionales, e incluye funcionalidad para pestañas, así como mucho más, como el cambio de tamaño fácil y widgets adicionales.

Para abordar algunas de las inquietudes que planteó en los comentarios a otras respuestas. GUI Layout Toolbox no utiliza características no documentadas / no compatibles / ocultas de MATLAB. Aunque no es un producto oficial de MathWorks, está desarrollado por Ben Tordoff y David Sampson del grupo de consultoría de MathWorks, y está disponible gratuitamente bajo una licencia, lo que significa que está bien que lo use e incluya en un producto desplegado.

Como nota al margen, mencionas en un comentario que cada una de tus pestañas incluye alrededor de 50 controles. Me pregunto si la solución real podría ser rediseñar un poco su GUI. Por supuesto, usted sabría mejor que yo lo que es apropiado para su aplicación, pero 50 controles visibles para el usuario a la vez parecen ser una mala idea desde el punto de vista de la usabilidad, además de presentar dificultades para los tiempos de redibujado de la GUI.