Text font size adapting to space
Firstly I'd simplify your maths:

$$
\text{font_size} = \text{width} * (\frac{\sqrt{\text{length}}}{\text{length}}) ^ {1.6}\\
(\frac{\sqrt{x}}{x})^{1.6} = \frac{1}{x^{0.8}}\\
\text{font_size} = \frac{\text{width}}{\text{length}^{0.8}}
$$

After this we're left with your if, personally I think using min would be better here, min(font_size, height * 0.9).
That way we know the maximum is \$\text{height} * 0.9\$ rather than \$\text{height}\$, and makes the font_size not jump.
This is up to you, but a jump in the font size is ugly in my opinion.

If we look at the affect of not using min and using min:

&gt;&gt;&gt; balanced_text_size_button(1, 89, 100)
89
&gt;&gt;&gt; balanced_text_size_button(1, 91, 100)
91
&gt;&gt;&gt; balanced_text_size_button(1, 100, 100)
100
&gt;&gt;&gt; balanced_text_size_button(1, 101, 100)
90
&gt;&gt;&gt; balanced_text_size_button_min(1, 89, 100)
89
&gt;&gt;&gt; balanced_text_size_button_min(1, 91, 100)
90
&gt;&gt;&gt; balanced_text_size_button_min(1, 100, 100)
90
&gt;&gt;&gt; balanced_text_size_button_min(1, 101, 100)
90


The above makes much more sense.
And so I'd change your function to:

def balanced_text_size_button(length, width, height):
    return int(min(width / math.pow(length, 0.8), height * 0.9))


And if you want to keep your description I'd use comments.
I wouldn't use a doc-string as the implementation details aren't needed by the end user.
I'd either use a heavy comment like you did:

def balanced_text_size_button(length, width, height):
    # Decide the font size by getting a desired with and height font size.
    # For text to not go out of the box, the smallest of the two wanted sizes is taken.
    # The width size is found by dividing the width by an exponential of the text.
    # An exponent is used to have a reduced affect on larger values.
    # The exponent 0.8 seems to give the best results.
    # The height is decided by picking a font size of 90% of it.
    return int(min(width / math.pow(length, 0.8), height * 0.9))


Or as the code is easy to understand, you can just say why you're using a magic variable.

def balanced_text_size_button(length, width, height):
    # The exponent 0.8 seems to give the best results.
    return int(min(width / math.pow(length, 0.8), height * 0.9))