Tabs in Godot 4: it is TabBar now
By Eduardo Orellana · Updated
Tabs is called TabBar in Godot 4; TabContainer, which shows one child per tab, is unchanged. In a Godot 4 project, Tabs.new() fails to parse with Identifier "Tabs" not declared in the current scope. Did you mean to use "TabBar"?.
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. Tabs 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 carries Tabs to TabBar. add_tab() adds a tab, current_tab selects one, and tab_changed fires when the player picks another. Use TabContainer when each tab should show its own panel.
Reproduce it
A Godot 3 script that creates a Tabs in code, in a Godot 4 project.
extends Node
func _ready():
var tabs = Tabs.new()
print(tabs)
What Godot 4.7.2 prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
SCRIPT ERROR: Parse Error: Identifier "Tabs" not declared in the current scope. Did you mean to use "TabBar"?
at: GDScript::reload (res://answers/tabs-in-godot-4/repro.gd:4)
ERROR: Failed to load script "res://answers/tabs-in-godot-4/repro.gd" with error "Parse error".
at: load (modules/gdscript/gdscript_resource_format.cpp:46)Fix it
A TabBar with three tabs, switched to the second.
extends Control
func _ready() -> void:
var tabs := TabBar.new()
for title in ["Video", "Audio", "Controls"]:
tabs.add_tab(title)
add_child(tabs)
tabs.tab_changed.connect(func(i): print("tab ", tabs.get_tab_title(i)))
tabs.current_tab = 1
print(tabs.get_class(), " tabs: ", tabs.tab_count)
What the fixed script prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
tab Audio
TabBar tabs: 3Verified 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 1469, Tabs to TabBar](https://github.com/godotengine/godot/blob/4.7.2-stable/editor/project_upgrade/renames_map_3_to_4.cpp#L1469), [TabBar class reference](https://github.com/godotengine/godot/blob/4.7.2-stable/doc/classes/TabBar.xml).
Questions
- Should I use TabBar or TabContainer?
- TabContainer for a settings screen whose tabs each show a panel; TabBar when you only need the row of tabs.
- How do I rename a tab?
- set_tab_title(index, title).
Related
- ToolButton in Godot 4: it is Button now
- TextureProgress in Godot 4: it is TextureProgressBar now
- Every verified Godot 4 answer
- Used tab character for indentation instead of space as used before in the file in Godot 4
- Sprite in Godot 4: it is Sprite2D now
- WindowDialog in Godot 4: it is Window now
- Identifier "…" not declared in the current scope in Godot 4
- Listener in Godot 4: it is AudioListener3D now
Flockbay's agent reads Godot's debugger output and fixes errors like this one in your project, on the official Godot.
Download Flockbay free