So I found you can set properties directly using path notation. So you don't have to use the get/set. You can see the path you need when you roll over them in the inspector.
tween_real.interpolate_property(custom_theme, "Button/colors/font_color", null, Color(randf(), randf(), randf()), 1.0, Tween.TRANS_QUAD, Tween.EASE_IN_OUT)
So that works, and the property is animated, but the buttons do not update on screen because they have to draw and the font_color doesn't trigger the NOTIFICATION_DRAW (which you can do manually by calling update).
However, I found a hack. Since you can animate the stylebox, and that DOES trigger the draw. So all you have to do is animate something (like bg_color) and set it to the same color as itself. It won't look any different, but it will trigger the draws for exactly the length of time of the animation. Kind of ugly, but it works.
extends Control
onready var custom_theme = preload("res://CustomTheme.tres")
onready var normal_box = custom_theme.get_stylebox("normal", "Button")
onready var button_a = get_node("ButtonA")
onready var button_b = get_node("ButtonB")
onready var tween_real = get_node("Tween1")
onready var tween_fake = get_node("Tween2")
func _ready():
randomize()
func _input(event):
if event.is_action_pressed("animate_color"):
tween_real.interpolate_property(custom_theme, "Button/colors/font_color", null, Color(randf(), randf(), randf()), 1.0, Tween.TRANS_QUAD, Tween.EASE_IN_OUT)
tween_real.start()
tween_fake.interpolate_property(normal_box, "bg_color", null, normal_box.bg_color, 1.0, Tween.TRANS_QUAD, Tween.EASE_IN_OUT)
tween_fake.start()
if event.is_action_pressed("animate_bg"):
tween_real.interpolate_property(normal_box, "bg_color", null, Color(randf(), randf(), randf()), 1.0, Tween.TRANS_QUAD, Tween.EASE_IN_OUT)
tween_real.start()