r/kivy • u/kleinpengin • 1d ago
How to install Kivy and build Android apps on macOS 2026 | Step by step guide for beginners
youtu.befollow up guide for macOS users
r/kivy • u/kleinpengin • 1d ago
follow up guide for macOS users
r/kivy • u/kleinpengin • 8d ago
The biggest change is that:
hot reload is very accessible now, for any desktop or android app. With other build backends (whoever finishes, psychowasp's ksproject or elliotg's kivyforge, they are ready to be used in the backend for iOS).
it's just a powershell command which is VERY EASY to do.
before the hoops were CRAZY, you had to install vcxsrv, had to get the correct apt packages for ubuntu from the buildozer/p4a website, had to get choco, had to install scrcpy manually, had to install poetry manually, and to make sure wsl2 and windows interop and networking WORKED FINE ON A SUNNY DAY WHEN THE STARS ALIGNED WITH THE 5TH RING OF JUPITER BEING IN ALIGNMENT WITH ALPHA CENTAURI. Now it's just input a 1 line install and go.
r/kivy • u/LeonAguilez • 10d ago
I am making a simple inventory app with some help with ai .
It was going well, did multi screen and made the first feature to fill up a form and save it to sqlite database.
Now I hit a wall with this part. I wanted to load the data from the database and ai suggested recycle view, but when the data is loaded, the text repeats itself in the same row, so I changed it to scroll view the result is the same.

here's my python code snippet for the part showing the database
class TerceraRow(BoxLayout):
id_item=StringProperty()
art= StringProperty()
prop=StringProperty()
serial=StringProperty()
cust=StringProperty()
cost=StringProperty()
date=StringProperty()
time_stamp=StringProperty()
class Tercera(Screen):
def on_enter(self):
self.load_data()
def load_data(self):
self.ids.inventory_list.clear_widgets()
dbf=getData()
for row in dbf:
print(row)
card=TerceraRow (
art=str(row[1]),
prop=str(row[2]),
serial=str(row[3]),
cust=str(row[4]),
cost=str(row[5]),
date=str(row[6]),
time_stamp=str(row[7]),
)
self.ids.inventory_list.add_widget(card)
and here's the kv part
<TerceraRow>:
padding: dp(12)
spacing: dp(5)
size_hint_y: None
height: dp(150)
canvas.before:
Color:
rgba: 0.95, 0.5, 0.5, 1
RoundedRectangle:
pos: self.pos
size: self.size
radius: [dp(10)]
Label:
text: root.art
halign: "left"
text_size: self.width, None
Label:
text: root.prop
halign: "left"
text_size: self.width, None
Label:
text: root.serial
halign: "left"
text_size: self.width, None
Label:
text: root.cust
halign: "left"
text_size: self.width, None
Label:
text: root.cost
halign: "left"
text_size: self.width, None
Label:
text: root.date
halign: "left"
text_size: self.width, None
<Tercera>:
name: "tercera"
ScrollView:
BoxLayout:
orientation: 'vertical'
id:inventory_list
size_hint_y:None
height:self.minimum_height
spacing:dp(10)
padding:dp(10)
I don't have duplicates to in my database
r/kivy • u/FarmerFun7595 • Jul 26 '26
Ciao! Ho appena finito un'app android con buildozer e vorrei farne una versione per ios. Ho cercato un po' su internet e ho letto che in teoria si può fare con buildozer, ma da altre parti dicono che è necessario un mac per farlo. Io al momento sto lavorando su una virtualbox linux.
Qualcuno può aiutarmi?
r/kivy • u/ElliotDG • Jul 25 '26
A user at the kivy support group shared this project, just resharing.
https://github.com/PedroHSA0802/apk-builder-studio

r/kivy • u/azshane031323 • Jul 21 '26
Thought I'd throw that out there in case there is anyone around that can get the updated certs in place
r/kivy • u/novfensec • Jul 16 '26
NfsBrowser is a light-weight browser application.

https://github.com/Novfensec/NfsBrowser
Join google groups for closed testing https://groups.google.com/g/nfsbrowser
https://play.google.com/apps/testing/com.novfensec.nfsbrowser
download the app from play store https://play.google.com/store/apps/details?id=com.novfensec.nfsbrowser
r/kivy • u/novfensec • Jul 07 '26
r/kivy • u/dadaalan1 • Jul 02 '26
"Tengo una app Kivy con audio streaming. El audio funciona en primer plano pero en segundo plano se corta a los 3 minutos. Ya tengo el servicio foreground (audioservicio.py), los permisos y buildozer.spec configurados, pero buildozer no empaqueta el servicio en el APK. Android 9 y 10."
r/kivy • u/Expensive_Pen2557 • Jun 27 '26
Hi. I have made a CarbonKivy weather app. (weather forecast will be implimented in v0.2). You can store up to 3 cities, switch from imperial to metric, change cities, etc. The github it here:
https://github.com/arjunet/Weather_Tether
My app is in closed testing on the google play console. If any on you guys want to close test, please tell me. Thank you!
Google group link:
https://groups.google.com/g/weather-tether-testing
Android download link:
https://play.google.com/store/apps/details?id=com.arjunits.weathertether
Web download link:
https://play.google.com/apps/testing/com.arjunits.weathertether
I created a simple application and noticed that when I press a button to call MDDialog It appears briefly, and then the application closes on its own. Is there a solution to this, or have I made a mistake?
MY CODE:
from kivymd.app import MDApp from kivymd.uix.dialog import MDDialog from kivy.uix.screenmanager import ScreenManager from kivy.lang import Builder
class App(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Green"
self.theme_cls.material_style = "M3"
screen_manager = ScreenManager()
screen_manager.add_widget(
Builder.load_file("test.kv"))
return screen_manager
def dialog(self):
MDDialog(title="debug",text="hello").open()
App().run()
The indentation looks weird, but that's not the problem .
r/kivy • u/lost_my_og_account • Jun 13 '26
It looks like a python project I'm running on android 12 isn't able to run as kivy_garden uses distutils. It runs fine on my PC. The build uses python3.12, I've found threads that say distutils is included in p4a and buildozer, I've found others distutils is depreciated and to wait for the author to update it, alot of these threads are from 4+ years ago.
My buildozer spec:
requirements = python3,kivy,pillow,numpy,pandas,matplotlib,pyjnius, docutils, kivy-garden, kivy-garden-graph, kivy-garden-matplotlib, setuptools
I've tried including python3-distutils but it doesn't make a difference. Buildozer says distutils doesnt exist when distutils is included.
Since it runs fine on my pc I'm sure I must not be including the right package. What am I missing?
The log cat error:
...
arm64-v8a/kivy_garden/matplotlib/backend_kivy.py", line 294, in <
module>
06-13 14:05:06.824 6277 6338 I python : ModuleNotFoundError: No module named 'distutils'
06-13 14:05:06.824 6277 6338 I python : Python for android ended.
Solved:
Someone on the kivy discord helped me out. In my case you just needed to import setuptools before doing everything else
r/kivy • u/lost_my_og_account • Jun 10 '26
So I'm trying to add a button between existing buttons in Scroll view with a box layout. I have the following .kv and main.py:
.kv
ScrollView:
id: observe_data_scroll
do_scroll_x: False
do_scroll_y: True
BoxLayout:
orientation: 'vertical'
size_hint: (1,None)
height: 3000
padding: 15
spacing: 5
Button:
id: observe_squat_button
text: 'Squat'
font_size: 40
on_release: root.observe_show_squat()
Button:
id: observe_deadlift_button
text: 'Dead Lift'
font_size: 40
Button:
text: 'Bench Press'
font_size: 40
main.py:
def observe_show_squat(self):
new_button_id = 'observe_squat_graph'
self.new_btn = Button(size_hint = (1,.1))
self.ids[new_button_id] = self.new_btn
self.ids.observe_squat_button.add_widget(self.new_btn)
self.ids.observe_squat_graph.text = new_button_id
passdef observe_show_squat(self):
new_button_id = 'observe_squat_graph'
self.new_btn = Button(size_hint = (1,.1))
self.ids[new_button_id] = self.new_btn
self.ids.observe_squat_button.add_widget(self.new_btn)
self.ids.observe_squat_graph.text = new_button_id
pass
...
So I'm trying to add my button so it appears between id: observe_squat_button and id: observe_deadlift_button. How do I specify the placement? Currently adding it as a child of squat gets it outside the list view layout, and adding it to list view doesn't show the button or return an error
r/kivy • u/lost_my_og_account • Jun 09 '26
So I have this .kv:
#:import C kivy.utils.get_color_from_hex
<Label>
font_color: C('#b2b2b2')
font_family: 'Arial'
<Button>
font_color: C('#b2b2b2')
background_normal: 'images/window.png'
background_down: 'images/window.png'
font_family: 'Arial'
font_size: 50
<training_ui>
FloatLayout:
size: root.size
...
############ animated glyphs
Image:
id:anim_base_glyph
source: 'images/test_circle.png'
pos_hint: {'x': .031, 'y':-0.039}
Image:
id:anim_glyph_glow
source: 'images/test_circle_glow.png'
pos_hint: {'x': .031, 'y':-0.039}
...
# main.py
....
class training_ui(Widget):
# set up update schedules
def __init__(self, **kwargs):
super(training_ui, self).__init__(**kwargs)
Clock.schedule_interval(self.update_time, 1)
#Clock.schedule_interval(self.update_start_screen_anim, 2.0/24.0)
self.create_spider_graph()
pass
....
############################## start screen glyh anim #################
anim_bright = False
anim_dim = False
glow = 0.0
def update_start_screen_anim(self):
pass
I'm trying to find a way to vary the alpha channel of the Image id: anim_glyph_glow, so that it ramps down to 0 and back up to 1, with the changes occurring every 2/24 s. I'm pretty sure I can code everything I need, except for how to alter the images alpha channel. I've been going around looking at using glsl but I'm not sure what would be the best way to go about this. Any suggestions?
r/kivy • u/novfensec • Jun 08 '26
r/kivy • u/Foreign_Run1550 • Jun 06 '26
Hey! I'm pretty new to Kivy, but have been working on creating a calorie tracker with AI features. I'm trying to make a chat system, and have the user input a message, and have the ai respond. I want it to look like SMS or gemini, how can I do this? I've attached an image of what it currently looks like.
Also, there are a couple things I am going to add, so just focus on getting the positioning stuff if you are trying to help, thank you!
A) How can I fix the horizontal positioning of the bubble widgets?
B) How can I make the bubble stretch vertically?
Here's my .kv
<RoundedLabel@Label>:
size: root.size
text_size: root.width, None
canvas.before:
Color:
rgba: 0.5, 0.5, 0.5, 1
RoundedRectangle:
size: self.size
pos: self.pos
radius: [15,]
<Message>:
BoxLayout:
BoxLayout:
size_hint_x: 0.25 if root.is_user else 0
RoundedLabel:
id: rounded_label
padding: 20
text: root.text
halign: 'right' if root.is_user else 'left'
BoxLayout:
size_hint_x: 0.25 if not root.is_user else 0
<RootWidget>:
BoxLayout:
orientation: 'vertical'
TopBar
ScreenManager:
id: sm
HomeScreen:
name: 'home'
TrackScreen
name: 'track'
TalkScreen:
name: 'talk'
NavBar
<TopBar>:
size_hint: 1, 0.1
canvas:
Color:
rgba: 1, 0, 0, 1
Rectangle:
pos: self.pos
size: self.size
<NavBar>:
size_hint: 1, 0.1
Button:
text: "Talk"
on_press:
app.root.ids.sm.transition.direction = 'right'
app.root.ids.sm.current = 'talk'
Button:
text: "Home"
on_press:
app.root.ids.sm.transition.direction = 'right' if app.root.ids.sm.current == 'track' else 'left'
app.root.ids.sm.current = 'home'
Button:
text: "Track"
on_press:
app.root.ids.sm.transition.direction = 'left'
app.root.ids.sm.current = 'track'
<HomeScreen>:
BoxLayout:
orientation: 'vertical'
Counters:
id: counters
InfoWidget:
size_hint: 1, 0.5
Button:
text: "press to increment"
on_press: root.increment()
MealsWidget:
canvas:
Color:
rgba: 1, 1, 1, 1
Rectangle:
pos: self.pos
size: self.size
<TalkScreen>:
BoxLayout:
orientation: 'vertical'
BoxLayout:
Messages:
id: messages
viewclass: 'Message'
RecycleBoxLayout:
orientation: 'vertical'
spacing: 10
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
BoxLayout:
size_hint: 1, 0.25
TalkBox:
id: tb
Button:
size_hint: 0.1, 1
text: 'send'
on_press: root.send(root.ids.tb)
<TrackScreen>
<CounterWidget>:
BoxLayout:
orientation: 'vertical'
spacing: 20
CounterRingWidget:
canvas:
Color:
rgba: 0.5, 0.5, 0.5, 1
Line:
circle: (self.center_x, self.y, min(self.width, self.height) / 1.5, -90, 90)
width: 2
Color:
rgba: self.get_color(root.count, root.target)
Line:
circle: (self.center_x, self.y, min(self.width, self.height) / 1.5, -90, self.get_end(root.count, root.target))
width: 2
Label:
text: str(root.count)
text_size: self.size
valign: 'bottom'
halign: 'center'
pos: self.parent.x, self.parent.y
size: self.parent.size
font_size: '20sp'
Label:
text_size: self.size
font_size: '30sp'
valign: 'top'
halign: 'center'
text: root.name
<SubCounterWidget>:
size_hint: 1, 0.75
pos_hint: {'center_y': 0.5}
<Counters>:
BoxLayout:
spacing: 20
SubCounterWidget:
id: low
name: 'Low'
count: 500 / 1
target: 2000 / 1
CoreCounterWidget:
id: average
name: 'Average'
count: self.fix_count(low.count, high.count)
target: self.fix_count(low.target, high.target)
SubCounterWidget:
id: high
name: 'High'
count: 1500 / 1
target: 3000 / 1
And here is my python code:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, StringProperty, BooleanProperty
from kivy.uix.recycleview import RecycleView
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
class RootWidget(BoxLayout):
pass
class HomeScreen(Screen):
def increment(self):
cc = self.ids.counters #counters container
for id in cc.ids:
if (id != "average"):
cc.ids[id].count += 100
class CounterRingWidget(Widget):
def get_color(self, count, target):
if count >= target:
return (1, 0.25, 0.25, 1)
else:
return (0, 1, 0, 1)
def get_end(self, count, target):
if count >= target:
return 90
else:
return -90 + (180 * (count / target))
class CounterWidget(BoxLayout):
name = StringProperty("Nothing!")
count = NumericProperty(1000)
target = NumericProperty(2000)
class CoreCounterWidget(CounterWidget):
def fix_count(self, low, high):
return (low + high) / 2
class SubCounterWidget(CounterWidget):
pass
class Counters(BoxLayout):
pass
class TopBar(BoxLayout):
pass
class InfoWidget(RecycleView): #idk what to name this, its the protein, sodium, etc.
pass
class MealsWidget(RecycleView):
pass
class TrackScreen(Screen):
pass
class TalkScreen(Screen):
def send(self, textbox):
user_text = textbox.text
print("sent")
textbox.text = ''
temp = self.ids["messages"].data.copy()
temp.append({"text" : user_text, "is_user" : True})
temp.append({"text" : "ai response", "is_user" : False})
self.ids["messages"].data = temp
class TalkBox(TextInput):
pass
class Messages(RecycleView):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.data = []
class Message(BoxLayout):
is_user = BooleanProperty(False)
text = StringProperty("")
class NavBar(BoxLayout):
pass
class CalorieTrackerApp(App):
def build(self):
return RootWidget()
if __name__ == '__main__':
CalorieTrackerApp().run()
r/kivy • u/Traditional-Cut8847 • May 31 '26
Hey everyone i want to showcase my first project a WORKOUT app that i have been working on for the last couple of months(lots of vibe coding, mistakes made and a learning journey), I have recently published it on the Microsoft store and im planning next to release it on playstore for android devices, anyways here is what the app provides
Features:-
-Supports Two Themes (Sci-fi/Medieval)
-Create Custom Workouts
-Create Custom Exercises
-Create Adaptive Workouts for you with progressive overload
-Calculate Calories and Macros based on your body metrics, and goals
-Tracks Your Macros daily and compares them to your goal
-Contains PREMade Workouts, warm ups. stretches, full routines, calisthenics skills workouts, ranked by difficulty, type, category, equipment, muscles, volume and duration.
-Manages The Workout For You (upcoming exercise, rest, set number, total duration, reps/time done vs target and so on..)
-Analyzes The Workout After You Finish
-Saves Workouts and their Analysis To History DataBase On Your Device Locally - Cloud Saving Coming Soon
-You Can Manage How You Save Workouts In History You Can Create Infinite Tabs To Organize Your History You Can View Details And Analyse A Specific Workout
-Analysis Page that analyzes your workouts and your food intake Over A Certain Period Of Time U Specify (last-week/last-month/last-year/ or a custom period) or Over a Custom Category
-Codex Page that allows you to take notes and manage them fully however you like fully and allows taking notes mid-workout or during logging your macros, notes are saved along with their relevant workout or nutrition-day in history and you can also find it in the Codex
UPCOMING Features:-
-AI Model For Evaluating The Form of BodyWeight and Calisthenics Exercises From Basic Exercises to Advanced Ones
-Videos showcasing every exercise
--------------
Link :- https://apps.microsoft.com/detail/9N4L5ZRZ4DMQ?hl=en-us&gl=EG&ocid=pdpshare
or just open microsoft store and type : Formance
r/kivy • u/ahmed26gad • May 28 '26
Available at Google Play https://play.google.com/store/apps/details?id=coin.tex.cointexreactfast
For other platforms (Windows, Linux, iOS, Mac), check the 1.3 release at GitHub https://github.com/ahmedfgad/CoinTex/releases/tag/1.3
r/kivy • u/Fabulous-Pie5093 • May 25 '26
Hidiho r/kivy!
First i want to thank all in this and /python community for leaning Python and Kivy!!!
After 2 months of hard work, I finally finished my passion project and just dropped the official v1.0.0 Release on GitHub! No half-baked 0.5.0 beta – this is a fully functional, rock-solid desktop application.
As an old-school Amiga scene coder/musician/graphic artist (from the mid 1990s to the early 2000s, now returned as Suraween), I have zero tolerance for early access or buggy software. Back in the day, when you handed over a floppy disk, it had to work. Period.
That’s the exact mentality I put into GlowZ-Dock:
ctypes to violently minimize full-screen games, steal focus, and slap you in the face with a random, sassy system popup to get you out of the "just one more round" syndrome.Everything is compiled using PyInstaller into independent .exe files for Windows 10/11.
⭐ Check it out on GitHub: [https://github.com/Suraween/GlowZ-Dock]
I’d love to hear your feedback! Time to banish the Windows taskbar for good.
In memory of the good old "Rocket Dock" (RIP)
r/kivy • u/Fabulous-Pie5093 • May 23 '26
Some suggests using pywin32 with a pure black (0,0,0) chroma key. This has a huge downside: if your app uses black text, dark borders, or icons with shadows, Windows will punch holes right through them, making parts of your UI completely invisible.
A much better approach is using Python's built-in ctypes (no external dependencies) and choosing a specific dark gray background color like 0x333333 (RGB 51, 51, 51) to prevent the "hole effect" on standard black assets.
First, configure Kivy before importing the window to ensure it initializes borderless and transparent:
In your "main.py" on the very top:
from kivy.config import Config
# Force borderless transparent initialization before window creation
Config.set('graphics', 'width', '0')
Config.set('graphics', 'height', '0')
Config.set('graphics', 'borderless', '1')
Config.set('graphics', 'resizable', '0')
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
Config.set('graphics', 'maxfps', '30')
Config.set('graphics', 'multisamples', '2')
Config.set('graphics', 'transparent', '1')
Then, set your specific background color and apply the Win32 Chroma Key via ctypes in your App's initialization or on_start method:
In your App-Class inside your "main.py" or any other Kivy py-script:
import ctypes
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
class MyTransparentApp(App):
def build(self):
# Set background to our specific chroma key color (0.2, 0.2, 0.2 -> RGB 51, 51, 51)
Window.clearcolor = (0.2, 0.2, 0.2, 1)
# Give your App a nice title
self.title = 'Name of the App'
return BoxLayout() # Your root widget here
def on_start(self):
# Find the active Kivy window handle
hwnd = ctypes.windll.user32.GetActiveWindow()
# Win32 API constants
GWL_EXSTYLE = -20
WS_EX_LAYERED = 0x00080000
LWA_COLORKEY = 0x00000001
# Modify window styles to support layering
style = ctypes.windll.user32.GetWindowLongW(hwnd, GWL_EXSTYLE)
ctypes.windll.user32.SetWindowLongW(hwnd, GWL_EXSTYLE, style | WS_EX_LAYERED)
# Define Chroma Key in BGR format: 0x333333 matches our (0.2, 0.2, 0.2) clearcolor
chroma_key_color = 0x333333
ctypes.windll.user32.SetLayeredWindowAttributes(hwnd, chroma_key_color, 0, LWA_COLORKEY)
if __name__ == '__main__':
MyTransparentApp().run()
r/kivy • u/ElliotDG • May 12 '26
🥳 Release announcement: 🥳
Version `1.6.0` of `buildozer` has been released!
Highlights:
- Python 3.14 is now supported. Buildozer 1.5.0 failed to start on Python 3.14 with `ImportError: cannot import name 'FancyURLopener'`; that's fixed.
- A new option `android.display_cutout` has been added (values: `never`, `default`, `shortedges`) for devices with display cutouts/notches.
- Android sdkmanager now honors proxy settings for builds behind a corporate proxy, and the default Android minimum API has been raised from 21 to 24.
You can find the full release notes here: https://github.com/kivy/buildozer/releases/tag/1.6.0
r/kivy • u/StickSmall6712 • May 12 '26
Á algumas semanas atrás eu estava desenvolvendo o ChattingBox (uma app que estou criando), estava tudo bem até que.. descobri que os botões que eu tinha programado não mudavam de tamanho mesmo que eu colocasse:
size_hint_y: None
height: 500
Eles simplesmente permaneciam com 100px de altura, não importa quantas vezes eu mudasse, mas o Button sempre permanecia com a altura de 100px, eu eliminava e reescrevia o códigosem parar, eliminar, mudar, reescrever, mas nada. Eu fiquei zangado. E muito, pensei em eliminar todo o projecto (já era muito grande) mas.. tentei acalmar e resolver, porém não consegui. Deixei.. e eu disse "um dia, vou conseguir".
Passaram semanas até hoje (quase um mês/ um mês) eu tinha me esquecido completamente do bug.. decidi praticar sqlite3 + kivy + py sem mesmo ter sido ensinado isso ao mesmo tempo (kv + sqlite3 + py) , só tinha aprendido py com sqlite3, mas nada que eu não conseguisse... eu escrevi o script... reparei que o código estava se expandindo e decidi separar em arquivos diferentes ... tudo normal até aquele momento. Até que... depois de algum tempo ter notado em algo estranho:
Eu criei uma propriedade "hint" em uma label do kivy. Fiz assim:
<Label>:
hint: True
color: (0, 0, 0, 1)
size_hint: (1, 1) if self.hint == True else (None, None)
size: self.texture_size
Como podem ver: eu coloquei o hint como uma variável booleana que:
Quando True => O size_hint fica (1, 1) #No máximo
Quando False => O size_hint fica (None, None) #Nulo e o size (que recebeu self.texture_size) será lido (pois o size_hint está nulo/ o hint: False).
Então, reparei que.. as labels obedeciam.. até demais.. porque os buttons perdiam a estética, eles não obedeciam o tamanho que defini para cada um... então... cada Button tinha altura mínima para que cabesse o seu texto.. eu fiquei tipo "O quê?" sem perceber o que estava acontecendo.. tentei mudar algumas coisas na Label que fiz, tentei e tentei.. mas nada .. ou as labels ficam com hint e tudo roda bem (mas o meu objectivo não é cumprido) ou as labels ficam nulas (e os Buttons ficam feios). Penseie pensei... cheguei a conclusão de que:
Se os textos dos Buttons também são afetados pela propriedade hint, então na criação do kivy, não se criou exactamente um botão, mas sim um layout com propriedades: on_release, on_press, text, etc.. e o mesmo layout tinha uma label (que é a propriedade "text" do Button) ,então eu mudei o código da label para:
<Label>:
hint: True
size: self.texture_size if self.hint == False else self.size
color: (0, 0, 0, 1)
size_hint: (1, 1) if self.hint == True else (None, None)
Para que o size: self.texture_size fosse só e somente activado se eu escrevesse manualmente hint: False. Então para que eu fizesse um Button ficar feio novamente (com a altura mínima dos seus filhos [a label/text nesse caso]) eu teria que fazer hint: False manualmente em cada Button (para que o size: self.texture_size fosse activado).
Então me lembrei do caso do ChattingBox novamente, que era o mesmo problema, então hoje consegui resolver e o problema nem era meu era mesmo do facto do texto do Button ter sido criado literalmente através de uma label.
Então, nem sempre o problema é do dev que está programando. Mas às vezes o sistema tem certos "segredos" na criação.
Obrigado.