Disable and Enable Buttons in AutoIt GUIs

Tutorial on how to disable and enable AutoIt GUI elements.

Last: How to make GUIs Next: Creating a list with selectable items

AutoIt Logo

It can sometimes be useful to disable GUI elements when they are not used, or while the function they trigger is active – this is mostly to avoid that an action is performed more than required, but also to avoid confusion.

Users will often click a button multiple times if nothing appears to happen, even if the program is performing the requested operations and just doesn't clearly show it. Doesn't matter much with your private AutoIt scripts, but if you are going to distribute them, then you should try to avoid confusing the users of your programs.

This AutoIt tutorial will demonstrate how you can disable GUI elements, either until the function an element triggers has finished running, or until another button is pressed.

How to Disable and Enable Buttons in AutoIt

To disable any GUI element, we will be using the $GUI_DISABLE parameter of GUICtrlSetState – the below AutoIt script will disable and enable two buttons, depending on what button was pushed.

#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

MainGUI()

Func MainGUI()
  Local $Button1, $Button2, $msg
  GUICreate("My GUI Window Title")

  Opt("GUICoordMode", 2)
  $Button1 = GUICtrlCreateButton("Button 1", 10, 30, 100)
  $Button2 = GUICtrlCreateButton("Button 2", 0, -1)

  GUISetState()
  GUICtrlSetState($Button2, $GUI_DISABLE)


  ; Run the GUI until the window is closed
  While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
       ExitLoop
    Case $msg = $Button1
	   GUICtrlSetState($Button1, $GUI_DISABLE)
	   GUICtrlSetState($Button2, $GUI_ENABLE)
       MsgBox(0, 'Button 1', 'Button 1 was pressed')
    Case $msg = $Button2
       GUICtrlSetState($Button1, $GUI_ENABLE)
	   GUICtrlSetState($Button2, $GUI_DISABLE)
       MsgBox(0, 'Button 2', 'Button 2 was pressed')
    EndSelect
  WEnd
EndFunc

The important part is where we are using GUICtrlSetState, the select statement has already been explained in the first Tutorial. GUICtrlSetState takes two parameters, the first is the Control ID of the GUI element, in this case this is contained in the variables they where assigned to, $Button1 and $Button2 – we use $GUI_ENABLE when we want to re-enable a grayed-out gui element.

GUICtrlSetState($Button1, $GUI_DISABLE)

Disable Button While Actions are Being Performed

If you want to disable a button while some actions are being performed, then you need to use GUICtrlSetState in a similar way, how to do this is shown in the below example.

#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

MainGUI()

Func MainGUI()
  Local $Button1, $Button2, $msg
  GUICreate("My GUI Window Title")

  Opt("GUICoordMode", 2)
  $Button = GUICtrlCreateButton("Button 1", 10, 30, 100)

  GUISetState()
  GUICtrlSetState($Button2, $GUI_DISABLE)


  ; Run the GUI until the window is closed
  While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
       ExitLoop
    Case $msg = $Button
	   GUICtrlSetState($Button, $GUI_DISABLE) ; disable the button

           ; Place your code or function call here

	   GUICtrlSetState($Button, $GUI_ENABLE) ; re-enable the button when done
    EndSelect
  WEnd
EndFunc