'Kivy: how to Restart App after press a button

I'm trying to restart my app when I change the language.

When I press the button to change language, the button's text lost it's position. When I close the application and open again, the text is in the right position.

I couldn't find anything like that, so I'd like to know if it's possible to restart the app for the text keep on the right position.

Code below:

PYTHON

from kivymd.app import MDApp
from kivymd.uix.floatlayout import FloatLayout
from kivymd.uix.button import MDRectangleFlatButton
from kivy.lang import Builder
import sqlite3
from kivy.uix.scrollview import ScrollView
from kivy.metrics import dp
from kivymd.uix.menu import MDDropdownMenu

KV = '''
ScreenManager:
    Screen:
        name: 'telaCategorias'
        BoxLayout:
            orientation: 'vertical'
            MDToolbar:
                id: tbCategoria
                right_action_items: [["dots-vertical", lambda x: app.callback_lang(x)]]
                md_bg_color: 0, 0, 0, 1
            Categorias:
                id: categoria

<Categorias>:
    ScrollView:
        MDList: 
            padding: '5dp'
            MDRoundFlatIconButton:
                id: btCat1
                text: 'teste'
                icon: 'glass-cocktail'
                font_size: '20sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
            
            MDRoundFlatIconButton:
                id: btCat2
                icon: 'cupcake'
                font_size: '20sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
                
            MDRoundFlatIconButton:
                id: btCat3
                icon: 'food-steak'
                font_size: '20sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
                
            MDRoundFlatIconButton:
                id: btCat4
                icon: 'hamburger'
                font_size: '20sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
                
            MDRoundFlatIconButton:
                id: btCat5
                icon: 'pasta'
                font_size: '20sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
                
            MDRoundFlatIconButton:
                id: btCat6
                icon: 'fish'
                font_size: '20sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
                
            MDRoundFlatIconButton:
                id: btCat7
                icon: 'food-turkey'
                font_size: '20sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
                
            MDRoundFlatIconButton:
                id: btCat8
                icon: 'soy-sauce'
                font_size: '19sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
                
            MDRoundFlatIconButton:
                id: btCat9
                icon: 'food-fork-drink'
                font_size: '20sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
                
            MDRoundFlatIconButton:
                id: btCat10
                icon: 'food-variant'
                font_size: '20sp'
                size_hint: (1, None)
                halign: 'left'
                line_color: (128/255,128/255,128/255)
                text_color: 0,2,0,1
                icon_color: 0,0,0,1
                
'''

class Categorias(FloatLayout):
    pass

class Aplicativo(MDApp):
    def on_start(self):
        self.menuLang()
        self.loadLang()
    
    def build(self):
        conn = sqlite3.connect('recipeDB.db')
        c = conn.cursor()
        c.execute("CREATE TABLE if not exists config (id integer primary key, name text)")
        self.insertLang()
        conn.commit()
        conn.close()
        return Builder.load_string(KV)
        
    def menuLang(self):
        menu_items = [{"viewclass":"MDRectangleFlatButton","text": "PT-BR","height": dp(35), "line_color": [0, 0, 1, 0], "text_color": [0, 0, 0, 1], "on_release": self.changePTBRLang,}, {"viewclass": "MDRectangleFlatButton","text": "EN","height": dp(50),"on_release": self.changeENLang,}]
        self.menu = MDDropdownMenu(items=menu_items,width_mult=2,)
    
    def callback_lang(self, button):
        self.menu.caller = button
        self.menu.open()
    
    def insertLang(self):
        conn = sqlite3.connect('recipeDB.db')
        c = conn.cursor()
        c.execute("INSERT OR IGNORE INTO config VALUES (:id, :name)", {'id': '1', 'name': 'EN',})
        conn.commit()
        conn.close()
    
    def loadLang(self):
        conn = sqlite3.connect('recipeDB.db')
        c = conn.cursor()
        c.execute("SELECT * FROM config")
        records = c.fetchall()
        for record in records:
            if record[1] == 'EN':
                self.changeENLang()
            elif record[1] == 'PT-BR':
                self.changePTBRLang()
        conn.commit()
        conn.close()
    
    def saveLang(self):
        conn = sqlite3.connect('recipeDB.db')
        c = conn.cursor()
        if self.codLang == '1':
            c.execute("UPDATE config set name = 'EN' where id = 1")
        elif self.codLang == '2':
            c.execute("UPDATE config set name = 'PT-BR' where id = 1")
        conn.commit()
        conn.close()
    
    codLang = '1'
    def changeENLang(self):
        self.codLang = '1'
        self.saveLang()
        self.root.ids.tbCategoria.title = 'CATEGORIES'
        self.root.ids.categoria.ids.btCat1.text = '  DRINKS'
        self.root.ids.categoria.ids.btCat2.text = '  CAKES AND SWEET PIES'
        self.root.ids.categoria.ids.btCat3.text = '  MEAT'
        self.root.ids.categoria.ids.btCat4.text = '  SNACKS'
        self.root.ids.categoria.ids.btCat5.text = '  BREADS AND PASTA'
        self.root.ids.categoria.ids.btCat6.text = '  FISHES AND SEA FOOD'
        self.root.ids.categoria.ids.btCat7.text = '  SPECIAL DISHES'
        self.root.ids.categoria.ids.btCat8.text = '  SALADS, SAUCES AND SIDE DISHES'
        self.root.ids.categoria.ids.btCat9.text = '  DESSERTS'
        self.root.ids.categoria.ids.btCat10.text = '  SOUP'
        self.menu.dismiss()
        
    def changePTBRLang(self):
        self.codLang = '2'
        self.saveLang()
        self.root.ids.tbCategoria.title = 'CATEGORIAS'
        self.root.ids.categoria.ids.btCat1.text = '  BEBIDAS'
        self.root.ids.categoria.ids.btCat2.text = '  BOLOS E TORTAS DOCES'
        self.root.ids.categoria.ids.btCat3.text = '  CARNES E AVES'
        self.root.ids.categoria.ids.btCat4.text = '  LANCHES'
        self.root.ids.categoria.ids.btCat5.text = '  PÃES E MASSAS'
        self.root.ids.categoria.ids.btCat6.text = '  PEIXES E FRUTOS DO MAR'
        self.root.ids.categoria.ids.btCat7.text = '  PRATOS ESPECIAIS'
        self.root.ids.categoria.ids.btCat8.text = '  SALADAS, MOLHOS E ACOMPANHAMENTOS'
        self.root.ids.categoria.ids.btCat9.text = '  SOBREMESAS'
        self.root.ids.categoria.ids.btCat10.text = '  SOPAS'
        self.menu.dismiss()
        
Aplicativo().run()


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source