Wolfram Function Repository
Instant-use add-on functions for the Wolfram Language
Function Repository Resource:
Create a button that is automatically disabled when clicked and enabled when it finishes running its code
ResourceFunction["DynamicEnabledButton"][label,action] represents a button that is labeled with label, evaluates action whenever it is clicked and automatically becomes disabled while action is evaluating.  | |
ResourceFunction["DynamicEnabledButton"][Dynamic[x],label,action] binds the enabled state to x.  | 
| Alignment | Automatic | how to align contents within the button | 
| Appearance | Automatic | the overall appearance of the button | 
| AutoAction | False | whether to click the button automatically when the mouse is over it | 
| Background | Automatic | button background color | 
| BaselinePosition | Automatic | alignment relative to surrounding text | 
| BaseStyle | "GenericButton" | base style specifications for the button | 
| ContentPadding | True | whether to shrink the margins tightly around the contents | 
| Enabled | Automatic | whether the button is enabled or grayed out | 
| Evaluator | Automatic | the kernel in which to evaluate expr | 
| FrameMargins | Automatic | minimum margins to leave inside the frame | 
| ImageMargins | 0 | margins around the image of the displayed button | 
| ImageSize | Full | the overall image size of the displayed button | 
| Method | "Queued" | the evaluation method to use | 
| Tooltip | None | the tooltip for the button | 
| TooltipDelay | 0.` | how long to delay before displaying the tooltip | 
| TooltipStyle | {} | style specifications for the tooltip | 
Create a button that automatically becomes disabled while it is running code:
| In[1]:= | 
| Out[1]= | 
Provide a symbol that is updated automatically as the button changes state:
| In[2]:= | 
| Out[2]= | 
Use a dynamic label:
| In[3]:= | 
| Out[3]= | 
Embed in other expressions:
| In[4]:= | 
| Out[4]= | ![]()  | 
Control the state of the button by setting values for the given symbol:
| In[5]:= | 
| Out[5]= | 
| In[6]:= | 
| Out[6]= | 
Use another control:
| In[7]:= | 
| Out[7]= | 
Change the label depending on the state of the button:
| In[8]:= | ![]()  | 
| Out[8]= | 
Create a group of buttons where only one can be clicked at a time:
| In[9]:= | ![]()  | 
| Out[9]= | 
Create multiple button groups:
| In[10]:= | ![]()  | 
| Out[10]= | ![]()  | 
Use in a graphics expression:
| In[11]:= | 
| Out[11]= | ![]()  | 
Display the label literally, without the appearance of a button:
| In[12]:= | 
| Out[12]= | 
The state need not be bound to a symbol:
| In[13]:= | ![]()  | 
| Out[6]= | 
Use the TaggingRules of the current notebook to store the button state:
| In[14]:= | 
| Out[14]= | 
Get the button state using CurrentValue:
| In[15]:= | 
| Out[15]= | 
Change the state:
| In[16]:= | 
| Out[16]= | 
To use a label of the form Dynamic[…] without specifying the dynamic binding, None can be used as the first argument to avoid ambiguity:
| In[17]:= | 
| Out[17]= | 
Different predefined alignment options:
| In[18]:= | ![]()  | 
| Out[18]= | ![]()  | 
Predefined button appearances:
| In[19]:= | ![]()  | 
| Out[19]= | 
On some platforms, the following appearances are also defined:
| In[20]:= | ![]()  | 
| Out[20]= | 
Use a second element to get the appearance of a pressed button:
| In[21]:= | ![]()  | 
| Out[21]= | 
Use a special appearance for the button:
| In[22]:= | 
| Out[22]= | 
By default, the button function does not evaluate until you click it:
| In[23]:= | 
| Out[23]= | 
By setting AutoAction, the button function evaluates as you mouse over the button area:
| In[24]:= | 
| Out[24]= | 
Change the background colors:
| In[25]:= | 
| Out[25]= | 
Change the background color on every click:
| In[26]:= | ![]()  | 
| Out[26]= | 
Align with the surrounding text:
| In[27]:= | ![]()  | 
| Out[27]= | 
Change the baseline position on every button click:
| In[28]:= | ![]()  | 
| Out[28]= | 
Remove extra whitespace around a label with no ascenders or descenders:
| In[29]:= | 
| Out[29]= | 
By default, DynamicEnabledButton is enabled:
| In[30]:= | 
| Out[30]= | 
By setting Enabled→False, the button is disabled but visible in its current state:
| In[31]:= | 
| Out[31]= | 
By starting the button with Enabled→False, the button can still be enabled manually by altering the given symbol:
| In[32]:= | 
| Out[32]= | 
| In[33]:= | 
| Out[33]= | 
Use preset values:
| In[36]:= | 
| Out[36]= | 
Or use any values:
| In[37]:= | 
| Out[37]= | ![]()  | 
By setting the second element, you can also control the height:
| In[38]:= | 
| Out[38]= | 
A fully customized image size:
| In[39]:= | 
| Out[39]= | ![]()  | 
Make a button that automatically indicates when it is busy computing something:
| In[40]:= | ![]()  | 
| Out[40]= | 
Create a button that deletes itself after spending a few seconds to express how it feels about being deleted:
| In[41]:= | ![]()  | 
Similar behavior to DynamicEnabledButton[Dynamic[x],label,action] can be achieved with Button:
| In[42]:= | 
| Out[42]= | 
| In[43]:= | 
| Out[32]= | 
The enabled state of the button is restored even if an abort occurs:
| In[44]:= | 
| Out[44]= | 
This prevents the button from ending up in a “bad” state:
| In[45]:= | ![]()  | 
| Out[32]= | 
The appearance of the button will not update when using Method→"Preemptive":
| In[46]:= | 
| Out[46]= | 
In DynamicEnabledButton[Dynamic[x],label,action], the symbol x must not be a DynamicModule symbol in order for the enabled state to update:
| In[47]:= | 
| Out[47]= | 
This is also true for Button:
| In[48]:= | ![]()  | 
| Out[48]= | 
The dynamic binding must have just one argument and no options:
| In[49]:= | 
| Out[49]= | 
If the binding is unable to be set, no errors will be triggered when the button is created:
| In[50]:= | 
| Out[48]= | 
| In[51]:= | 
| Out[51]= | 
Messages will appear when the button code executes and the state of the button will fail to update:
| In[52]:= | 
| Out[52]= | 
Watch Birdnardo do a flip:
| In[53]:= | ![]()  | 
| Out[53]= | ![]()  | 
This work is licensed under a Creative Commons Attribution 4.0 International License