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.
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: trueVerified 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.
Related
- How to connect signals in code in Godot 4
- TextureProgress in Godot 4: it is TextureProgressBar now
- Every verified Godot 4 answer
- WindowDialog in Godot 4: it is Window now
- ARVRController in Godot 4: it is XRController3D now
- Sprite in Godot 4: it is Sprite2D now
- The "tool" keyword was removed in Godot 4: use @tool
- Identifier "…" not declared in the current scope in Godot 4
Flockbay's agent reads Godot's debugger output and fixes errors like this one in your project, on the official Godot.
Download Flockbay free