ToolButton in Godot 4: use a flat Button

By Eduardo Orellana · Updated

Godot 4 has no ToolButton. A Button with its flat property on draws the same way, with no background until hovered. In a Godot 4 project, ToolButton.new() fails to parse with Identifier "ToolButton" not declared in the current scope. Did you mean to use "Button"?.

AppImage, x86_64. Ubuntu 22.04, Debian 12, Fedora 39 or newer.

Intel or AMD Chromebook, with Linux turned on.

Download for macOSDownload for Windows

What Godot is checking

GDScript resolves every name when the script loads. ToolButton is not a class in Godot 4, so the analyzer stops before anything runs, and because the name is in Godot's own table of Godot 3 renames, the message names the replacement.

The converter turns ToolButton into Button. Set flat = true on it, in the Inspector or in code, to get the toolbar look.

Reproduce it

A Godot 3 script that creates a ToolButton in code, in a Godot 4 project.

extends Node

func _ready():
	var button = ToolButton.new()
	print(button)

What Godot 4.7.2 prints

Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org

SCRIPT ERROR: Parse Error: Identifier "ToolButton" not declared in the current scope. Did you mean to use "Button"?
   at: GDScript::reload (res://answers/toolbutton-in-godot-4/repro.gd:4)
ERROR: Failed to load script "res://answers/toolbutton-in-godot-4/repro.gd" with error "Parse error".
   at: load (modules/gdscript/gdscript_resource_format.cpp:46)

Fix it

A flat Button with its pressed signal connected.

extends Control

func _ready() -> void:
	var button := Button.new()
	button.text = "Tool"
	button.flat = true
	add_child(button)
	button.pressed.connect(func(): print("pressed"))
	button.pressed.emit()
	print(button.get_class(), " flat: ", button.flat)

What the fixed script prints

Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org

pressed
Button flat: true

Verified on Godot 4.7.2

Both scripts on this page were run headless on Godot 4.7.2 (4.7.2.stable.mono.official.ed1daf0bf) on 18 October 2026, and the output above is what Godot printed, unedited.

Where the check lives in Godot's source: [gdscript_analyzer.cpp line 4687, the message with its hint](https://github.com/godotengine/godot/blob/4.7.2-stable/modules/gdscript/gdscript_analyzer.cpp#L4687), [renames_map_3_to_4.cpp line 1616, ToolButton to Button](https://github.com/godotengine/godot/blob/4.7.2-stable/editor/project_upgrade/renames_map_3_to_4.cpp#L1616), [Button class reference](https://github.com/godotengine/godot/blob/4.7.2-stable/doc/classes/Button.xml).

Questions

How do I make a toggle button?
Set toggle_mode = true and read button_pressed, or connect toggled.
How do I put an icon on it?
Set icon to a Texture2D; expand_icon scales it to the button.