user2457516
user2457516

Reputation:

MATLAB GUI drawnow renderes button 'pushed down' instead of 'disabled'

I am running the drawnow statement from a callback function within a MATLAB GUI to update the state of a button. At the beginning of the callback (which has high runtime) I alter the properties of the button and force an update with drawnow. While updateing properly, the button remains rendered 'pushed down' instead of 'disabled'. After the callback is finished, the button is updated again and now rendered 'disabled'.

Take following minmal (not) working example:

function simple_example()
h = figure();
% add a button, give it some properties and a callback
uicontrol(h,...
    'Style','pushbutton',...
    'String','I am enabled',...
    'Units','normalized',...
    'Position',[0.5 0.5 0.4 0.4],...
    'Callback',@btn_callback);
end

function btn_callback(hObject, ~)
    set(hObject,'Enable','off');
    set(hObject,'String','I am disabled');
    drawnow;
    pause(3);
end

Is there a way to change this behavior and have the button appear disabled while the callback is still executing?

Upvotes: 4

Views: 85

Answers (1)

lhcgeneva
lhcgeneva

Reputation: 1981

As you are asking about appearance here's a workaround using uibuttongroup:

function simple_example()
h = figure();
b = uibuttongroup('Position',[0.5 0.5 0.4 0.4]);
bgcolor = b.BackgroundColor;
% add a button, give it some properties and a callback
uicontrol(b,...
    'Style','pushbutton',...
    'String','I am enabled',...
    'Units','normalized',...
    'Position',[-0.05 -0.05 1.1 1.1],...
    'Callback',@btn_callback);
end

function btn_callback(hObject, ~)
    set(hObject,'Enable','off');
    set(hObject,'String','I am disabled');
    drawnow;
    pause(3);
end

Here, you fit the button within a uibuttongroup, which normally groups several uibuttons and then set the button size bigger than the actual uibuttongroup, so the borders don't appear.

However, this let's you lose the button down rendering. You could get that back by altering the uicontrolgroup's border properties.

Update:

This seems to be OS-specific. On OS X your code works just fine, as far as I can see. Windows, I don't know, but according to your comment neither my version, nor yours seems to fix the issue. On Ubuntu, on the other hand, my answer solves the problem.

Upvotes: 1

Related Questions