1

I am trying to run my function in a thread so that GUI doesn't freeze. However, it isn't working. I tried to thread the GUI call in the "main". I also tried to call to thread the function which is taking time for calculation. None of of the methods seems working. What am I doing wrong?

My .py file

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.screenmanager import ScreenManager, Screen
import os
import pathlib
import main
import threading

class FirstWindow(Screen):
    def select_cities(self, country):
        cities = []
        for file in os.listdir(r'WeatherFiles/'+country):
            # check the files which are end with specific extension
            if file.endswith(".txt"):
                y = pathlib.Path(file)
                cities.append(y.stem)
        self.ids.city_list.values = cities

    def selected_city(self, city):
        self.ids.output.text = "[b]Please upload the weather file![/b]"


    def getdata(self, city,country):
        global data_file
        data_file = 'WeatherFiles/'+country+'/'+city+'.txt'
        self.ids.output.text = "Please Wait..."
        x = threading.Thread(target=self.uploaddata(data_file))
        x.start()

    def uploaddata(self, data_file):
        self.ids.output.text = 'Please wait...'
        try:
            main.ClimateData(data_file)
            self.ids.output.text = '[b]Weather Data Uploaded Successfully![/b]'
        except:
            self.ids.output.text = 'Sorry! There was some error!'

class SecondWindow(Screen):
    def exitf(self):
        os._exit(0)


class ThirdWindow(Screen):
    def inputs(self):
        y = threading.Thread(target=self.calculate())
        y.start()

    def calculate(self):
        Electricity_rate = float(self.manager.get_screen("second").ids.Electricity_rate.text)
        CO2_rate = float(self.manager.get_screen("second").ids.CO2_rate.text)
        Set_temp = float(self.manager.get_screen("second").ids.Set_temp.text)
        New_set_temp = float(self.manager.get_screen("second").ids.New_set_temp.text)
        Wall_thickness = float(self.manager.get_screen("second").ids.Wall_thickness.text)
        Roof_thickness = float(self.manager.get_screen("second").ids.Roof_thickness.text)
        Thermal_conductivity_wall = float(self.manager.get_screen("second").ids.Thermal_conductivity_wall.text)
        Thermal_conductivity_roof = float(self.manager.get_screen("second").ids.Thermal_conductivity_roof.text)
        Wall_area = float(self.manager.get_screen("second").ids.Wall_area.text)
        Roof_area = float(self.manager.get_screen("second").ids.Roof_area.text)
        COP_chillers = float(self.manager.get_screen("second").ids.COP_chillers.text)
        try:
            main.Calculation(data_file, Electricity_rate, CO2_rate, Set_temp, New_set_temp, Wall_thickness,
                             Thermal_conductivity_wall, Roof_thickness, Thermal_conductivity_roof, Roof_area, Wall_area,
                             COP_chillers)
            self.ids.output.text = 'Calculation Successful!'
            Annual_saving, Annual_saving_per, Annual_saving_SAR, Annual_saving_CO2 = main.Calculation(data_file,
                                                                                                      Electricity_rate,
                                                                                                      CO2_rate,
                                                                                                      Set_temp,
                                                                                                      New_set_temp,
                                                                                                      Wall_thickness,
                                                                                                      Thermal_conductivity_wall,
                                                                                                      Roof_thickness,
                                                                                                      Thermal_conductivity_roof,
                                                                                                      Roof_area,
                                                                                                      Wall_area,
                                                                                                      COP_chillers)
            self.ids.Annual_saving.text = str(Annual_saving)
            self.ids.Annual_saving_per.text = str(Annual_saving_per)
            self.ids.Annual_saving_SAR.text = str(Annual_saving_SAR)
            self.ids.Annual_saving_CO2.text = str(Annual_saving_CO2)

        except Exception as e:
            # self.ids.output.text = str(e)
            self.ids.output.text = 'Weather Data not Found!'

def select_countries():
    countries = []

    for file in os.listdir(r'WeatherFiles/'):
        y = pathlib.Path(file)
        countries.append(y.stem)
    return countries



class EnergyApp_v_22_11_02(App):

    select_countries()
    countries = select_countries()

    def build(self):
        self.root_layout = ScreenManager()
        return self.root_layout

if __name__ == "__main__":
    threading.Thread(target=EnergyApp_v_22_11_02().run())

Here is my .kv file:

#:import get_color_from_hex kivy.utils.get_color_from_hex
#:import Gradient kivy_gradient.Gradient
#:import threading threading

<ScreenManager>:
    FirstWindow:
        name: "first"
    SecondWindow:
        name: "second"
    ThirdWindow:
        name: "third"

<FirstWindow>:
    canvas.before:
        #Color:
        #    rgba: (77/255,68/255,101/255,1)
        Rectangle:
            pos: self.pos
            size:self.size
            texture: Gradient.vertical(get_color_from_hex("#d9e6f2"), get_color_from_hex("#f7fafc"))

    FloatLayout:
        pos: 0, 0
        size: root.width, root.height

        Image:
            source: 'Resources/Logo.png'
            pos_hint: {'x': 0,  'y': .88 }
            size_hint: (.1, .1)

        Label:
            id: output
            canvas.before:
                Color:
                    rgba: (245/255, 245/255,245/255,1)
                RoundedRectangle:
                    pos: self.pos
                    size:self.size
                    texture: Gradient.vertical(get_color_from_hex("#f7baba"), get_color_from_hex("#f7baba"))
                    radius: [10]
            background_normal: ''
            background_color: (0,0,0,0)
            markup: True
            text: '[i][b]Select the Location[/b][/i]'
            font_size: 18
            color: '#FFFFFF'
            padding_x: 25
            padding_y: 25
            pos_hint: {'x': .1,  'y': .4 }
            size_hint: (.5, .4)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'



        Spinner:
            id: country_list
            canvas.before:
                Color:
                    rgba: (245/255, 245/255,245/255,1)
                RoundedRectangle:
                    pos: self.pos
                    size:self.size
                    texture: Gradient.vertical(get_color_from_hex("#97b5ad"), get_color_from_hex("#97b5ad"))
                    radius: [5]
            background_normal: ''
            background_color: (0,0,0,0)
            markup:True
            text: '[b]Countries[/b]'
            font_size: 18
            values: app.countries
            pos_hint: {'x': .65,  'y': .71 }
            size_hint: (.2, .08)
            on_text: root.select_cities(self.text)


        Spinner:
            id: city_list
            canvas.before:
                Color:
                    rgba: (245/255, 245/255,245/255,1)
                RoundedRectangle:
                    pos: self.pos
                    size:self.size
                    texture: Gradient.vertical(get_color_from_hex("#97b5ad"), get_color_from_hex("#97b5ad"))
                    radius: [5]
            background_normal: ''
            background_color: (0,0,0,0)
            markup:True
            text: '[b]Cities[/b]'
            font_size: 18
            #values: root.cities
            pos_hint: {'x': .65,  'y': .6 }
            size_hint: (.2, .08)
            on_text: root.selected_city(self.text)


        Button:
            id: upload_data
            canvas.before:
                Color:
                    rgba: (245/255, 245/255,245/255,1)
                RoundedRectangle:
                    pos: self.pos
                    size:self.size
                    texture: Gradient.vertical(get_color_from_hex("#2e5c84"), get_color_from_hex("#2e5c84"))
                    radius: [2]
            background_normal: ''
            background_color: (0,0,0,0)
            markup:True
            text: 'Upload'
            font_size: 18
            #background_normal: ''
            #background_color: (0,0,0,0)
            pos_hint: {'x': .65,  'y': .4 }
            size_hint: (.2, .08)
            on_press:
                output.text: '[i]Please Wait...[/i]'
            on_release: threading.Thread(target=root.getdata(city_list.text, country_list.text)).start()

        Button:
            canvas.before:
                Color:
                    rgba: (245/255, 245/255,245/255,1)
                RoundedRectangle:
                    pos: self.pos
                    size:self.size
                    texture: Gradient.vertical(get_color_from_hex("#21425e"), get_color_from_hex("#21425e"))
                    radius: [2]
            background_normal: ''
            background_color: (0,0,0,0)
            text: "Next"
            font_size: 17
            pos_hint: {'x': .75,  'y': .08 }
            size_hint: (.17, .07)
            on_release:
                app.root.current = "second"
                root.manager.transition.direction = "left"

<SecondWindow>:
    canvas.before:
        #Color:
        #    rgba: (77/255,68/255,101/255,1)
        Rectangle:
            pos: self.pos
            size:self.size
            texture: Gradient.vertical(get_color_from_hex("#f9fbfb"), get_color_from_hex("#FFFFFF"))

    FloatLayout:
        pos: 0, 0
        size: root.width, root.height
        Image:
            source: 'Resources/Logo.png'
            pos_hint: {'x': 0,  'y': .88 }
            size_hint: (.1, .1)
        Label:
            id: label_1
            markup: True
            text: 'Electricity Rate'
            font_size: 17
            color: '#21425f'
            padding_y: 8
            pos_hint: {'x': .07,  'y': .8 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'
        TextInput:
            id: Electricity_rate
            font_size: 17
            text: '0.25'
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .28,  'y': .8 }
            size_hint: (.09, .06)
        Label:
            id: label_2
            markup: True
            text: '[i]SAR/kWh[/i]'
            font_size: 17
            color: '#21425f'
            padding_y: 8
            pos_hint: {'x': .38,  'y': .8 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'
        Label:
            id: label_3
            markup: True
            text: '[i]CO2 Rate[/i]'
            font_size: 15
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .49,  'y': .8 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        TextInput:
            id: CO2_rate

            font_size: 17
            text: '0.569'
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .7,  'y': .8 }
            size_hint: (.09, .06)

        Label:
            id: label_4
            markup: True
            text: '[i]kg/kWh[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .8,  'y': .8 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'
        Label:
            id: label_5
            markup: True
            text: '[i]Set-point Temperature[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            multiline: True
            pos_hint: {'x': .07,  'y': .7 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'
        TextInput:
            id: Set_temp
            text: '21.0'
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .28,  'y': .7 }
            size_hint: (.09, .06)

        Label:
            id: label_6
            markup: True
            text: '[i]C[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .38,  'y': .7 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'


        Label:
            id: label_7
            markup: True
            text: '[i]New Set-point Temperature[/i]'
            font_size: 15
            color: '#161748'
            #padding_y: 8
            multiline: True
            pos_hint: {'x': .49,  'y': .7 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        TextInput:
            id: New_set_temp
            text: '23.5'
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .7,  'y': .7 }
            size_hint: (.09, .06)

        Label:
            id: label_8
            markup: True
            text: '[i]C[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .8,  'y': .7 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'


        Label:
            id: label_9
            markup: True
            text: '[i]Wall Thickness[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            multiline: True
            pos_hint: {'x': .07,  'y': .6 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'


        TextInput:
            id: Wall_thickness
            text: '20.0'
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .28,  'y': .6 }
            size_hint: (.09, .06)

        Label:
            id: label_10
            markup: True
            text: '[i]cm[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .38,  'y': .6 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'


        Label:
            id: label_11
            markup: True
            text: '[i]Roof Thickness[/i]'
            font_size: 15
            color: '#161748'
            padding_y: 8
            #multiline: True
            pos_hint: {'x': .49,  'y': .6 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        TextInput:
            id: Roof_thickness
            text: '20.0'
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .7,  'y': .6 }
            size_hint: (.09, .06)

        Label:
            id: label_12
            markup: True
            text: '[i]cm[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .8,  'y': .6 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'


        Label:
            id: label_13
            markup: True
            text: '[i]Wall Thermal Conductivity[/i]'
            font_size: 15
            color: '#161748'
            #padding_y: 8
            multiline: True
            pos_hint: {'x': .07,  'y': .5 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        TextInput:
            id: Thermal_conductivity_wall
            text: '1.2'
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .28,  'y': .5 }
            size_hint: (.09, .06)

        Label:
            id: label_14
            markup: True
            text: '[i]W/mC[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .38,  'y': .5 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'



        Label:
            id: label_15
            markup: True
            text: '[i]Roof Thermal Conductivity[/i]'
            font_size: 15
            color: '#161748'
            #padding_y: 8
            multiline: True
            pos_hint: {'x': .49,  'y': .5 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        TextInput:
            id: Thermal_conductivity_roof
            text: '1.2'
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .7,  'y': .5 }
            size_hint: (.09, .06)

        Label:
            id: label_16
            markup: True
            text: '[i]W/mC[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .8,  'y': .5 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'


        Label:
            id: label_17
            markup: True
            text: '[i]Wall Area[/i]'
            font_size: 15
            color: '#161748'
            padding_y: 8
            #multiline: True
            pos_hint: {'x': .07,  'y': .4 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        TextInput:
            id: Wall_area
            text: '490.0'
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .28,  'y': .4 }
            size_hint: (.09, .06)

        Label:
            id: label_18
            markup: True
            text: '[i]m2[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .38,  'y': .4 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'

        Label:
            id: label_19
            markup: True
            text: '[i]Roof Area[/i]'
            font_size: 15
            color: '#161748'
            padding_y: 8
            #multiline: True
            pos_hint: {'x': .49,  'y': .4 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        TextInput:
            id: Roof_area
            text: '688.0'
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .7,  'y': .4 }
            size_hint: (.09, .06)

        Label:
            id: label_20
            markup: True
            text: '[i]m2[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .8,  'y': .4 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'


        Label:
            id: label_21
            markup: True
            text: '[i]COP of the Chiller[/i]'
            font_size: 15
            color: '#161748'
            padding_y: 8
            #multiline: True
            pos_hint: {'x': .49,  'y': .3 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        TextInput:
            id: COP_chillers
            text: '3.5'
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .7,  'y': .3 }
            size_hint: (.09, .06)

        Label:
            id: label_22
            markup: True
            text: '[i][/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .8,  'y': .3 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'

        Button:
            text: "Next"
            font_size: 17
            pos_hint: {'x': .7,  'y': .1 }
            size_hint: (.2, .08)
            on_release:
                app.root.current = "third"
                root.manager.transition.direction = "left"

        Button:
            text: "Back"
            font_size: 17
            pos_hint: {'x': .1,  'y': .1 }
            size_hint: (.2, .08)
            on_release:
                app.root.current = "first"
                root.manager.transition.direction = "right"

<ThirdWindow>:
    canvas.before:
        #Color:
        #    rgba: (77/255,68/255,101/255,1)
        Rectangle:
            pos: self.pos
            size:self.size
            texture: Gradient.vertical(get_color_from_hex("#e5e7e9"), get_color_from_hex("898AA6"))

    FloatLayout:
        pos: 0, 0
        size: root.width, root.height

        Label:
            id: output
            canvas.before:
                Color:
                    rgba: (245/255, 245/255,245/255,1)
                Rectangle:
                    pos: self.pos
                    size:self.size
                    texture: Gradient.horizontal(get_color_from_hex("C9BBCF"), get_color_from_hex("#EBEDEF"))
            markup: True
            text: '[i]Press Calculate[/i]'
            font_size: 17
            color: '#161748'
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .25,  'y': .75 }
            size_hint: (.5, .1)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'

        Button:
            id: calculate
            markup:True
            text: 'Calculate'
            font_size: 18
            #background_normal: ''
            #background_color: (0,0,0,0)
            pos_hint: {'x': .55,  'y': .65 }
            size_hint: (.2, .08)
            on_release: root.inputs()

        Label:
            id: label_23
            markup: True
            text: '[i]Annual Electricity Saving[/i]'
            font_size: 15
            color: '#161748'
            #padding_y: 8
            multiline: True
            pos_hint: {'x': .07,  'y': .5 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        Label:
            id: Annual_saving
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .28,  'y': .5 }
            size_hint: (.09, .06)

        Label:
            id: label_24
            markup: True
            text: '[i]kWh[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .38,  'y': .5 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'



        Label:
            id: label_25
            markup: True
            text: '[i]Percentage Reduction[/i]'
            font_size: 15
            color: '#161748'
            padding_y: 8
            #multiline: True
            pos_hint: {'x': .54,  'y': .5 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        Label:
            id: Annual_saving_per
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .75,  'y': .5 }
            size_hint: (.09, .06)

        Label:
            id: label_26
            markup: True
            text: '[i]%[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .85,  'y': .5 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'

        Label:
            id: label_27
            markup: True
            text: '[i]Annual Bill Saving[/i]'
            font_size: 15
            color: '#161748'
            #padding_y: 8
            multiline: True
            pos_hint: {'x': .07,  'y': .4 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        Label:
            id: Annual_saving_SAR
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .28,  'y': .4 }
            size_hint: (.09, .06)

        Label:
            id: label_28
            markup: True
            text: '[i]SAR[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .38,  'y': .4 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'

        Label:
            id: label_29
            markup: True
            text: '[i]CO2 Emission Reduction[/i]'
            font_size: 15
            color: '#161748'
            padding_y: 8
            #multiline: True
            pos_hint: {'x': .54,  'y': .4 }
            size_hint: (.2, .06)
            text_size: self.width, self.height
            halign: 'right'
            valign: 'top'

        Label:
            id: Annual_saving_CO2
            foreground_color: (22/255, 23/255,72/255,1)
            #background_color: (245/255, 245/255,245/255,1)
            multiline: False
            padding_x: 15
            padding_y: 10
            pos_hint: {'x': .75,  'y': .4 }
            size_hint: (.09, .06)

        Label:
            id: label_30
            markup: True
            text: '[i]tCO2[/i]'
            font_size: 16
            color: '#161748'
            padding_y: 8
            pos_hint: {'x': .85,  'y': .4 }
            size_hint: (.09, .06)
            text_size: self.width, self.height
            halign: 'left'
            valign: 'top'





        Button:
            text: "Exit"
            font_size: 17
            pos_hint: {'x': .7,  'y': .1 }
            size_hint: (.2, .08)
            on_release: root.exitf()

        Button:
            text: "Back"
            font_size: 17
            pos_hint: {'x': .1,  'y': .1 }
            size_hint: (.2, .08)
            on_release:
                app.root.current = "second"
                root.manager.transition.direction = "right"
James Z
  • 12,209
  • 10
  • 24
  • 44
zxcvb
  • 11
  • 2
  • You are not using `Thread` properly. However your posted code is too large to handle, try posing a [minimal](https://stackoverflow.com/help/minimal-reproducible-example) one. – ApuCoder Nov 13 '22 at 14:19

1 Answers1

0

this sequence is the way to go:

x = threading.Thread(target=self.uploaddata, args=(datafile, ))
x.start()

EDIT: my apologies, I missed the syntax of the call to Thread previously. note the use of args

If the thread starts and ends relatively quickly or deterministically this is fine. You can also start a thread that runs forever and if you have that kind then you should set daemon=True when creating the Thread object and this will cause it to automatically terminate when your main application stops.

Python File

#
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.screenmanager import ScreenManager, Screen
import os
import pathlib
import main
import threading

class FirstWindow(Screen):

    def __init__(self, **kw):
        super().__init__(**kw)

    def select_cities(self, country):
        cities = []
        for file in os.listdir(r'WeatherFiles/'+country):
            # check the files which are end with specific extension
            if file.endswith(".txt"):
                y = pathlib.Path(file)
                cities.append(y.stem)
        self.ids.city_list.values = cities

    def selected_city(self, city):
        self.ids.output.text = "[b]Please upload the weather file![/b]"


    def getdata(self, city,country):
        global data_file
        data_file = str(pathlib.Path('WeatherFiles', country, city, ".txt"))
        self.ids.output.text = "Please Wait..."
        x = threading.Thread(target=self.uploaddata(data_file))
        x.start()

    def uploaddata(self, data_file):
        self.ids.output.text = 'Please wait...'
        try:
            main.ClimateData(data_file)
            self.ids.output.text = '[b]Weather Data Uploaded Successfully![/b]'
        except:
            self.ids.output.text = 'Sorry! There was some error!'


class SecondWindow(Screen):
    def exitf(self):
        os._exit(0)


class ThirdWindow(Screen):

    def exitf(self):
        print("exiting the app")
        App.get_running_app().stop()

    def inputs(self):
        y = threading.Thread(target=self.calculate())
        y.start()

    def calculate(self):
        Electricity_rate = float(self.manager.get_screen("second").ids.Electricity_rate.text)
        CO2_rate = float(self.manager.get_screen("second").ids.CO2_rate.text)
        Set_temp = float(self.manager.get_screen("second").ids.Set_temp.text)
        New_set_temp = float(self.manager.get_screen("second").ids.New_set_temp.text)
        Wall_thickness = float(self.manager.get_screen("second").ids.Wall_thickness.text)
        Roof_thickness = float(self.manager.get_screen("second").ids.Roof_thickness.text)
        Thermal_conductivity_wall = float(self.manager.get_screen("second").ids.Thermal_conductivity_wall.text)
        Thermal_conductivity_roof = float(self.manager.get_screen("second").ids.Thermal_conductivity_roof.text)
        Wall_area = float(self.manager.get_screen("second").ids.Wall_area.text)
        Roof_area = float(self.manager.get_screen("second").ids.Roof_area.text)
        COP_chillers = float(self.manager.get_screen("second").ids.COP_chillers.text)
        try:
            main.Calculation(data_file, Electricity_rate, CO2_rate, Set_temp, New_set_temp, Wall_thickness,
                             Thermal_conductivity_wall, Roof_thickness, Thermal_conductivity_roof, Roof_area, Wall_area,
                             COP_chillers)
            self.ids.output.text = 'Calculation Successful!'
            Annual_saving, Annual_saving_per, Annual_saving_SAR, Annual_saving_CO2 = main.Calculation(data_file,
                                                                                                      Electricity_rate,
                                                                                                      CO2_rate,
                                                                                                      Set_temp,
                                                                                                      New_set_temp,
                                                                                                      Wall_thickness,
                                                                                                      Thermal_conductivity_wall,
                                                                                                      Roof_thickness,
                                                                                                      Thermal_conductivity_roof,
                                                                                                      Roof_area,
                                                                                                      Wall_area,
                                                                                                      COP_chillers)
            self.ids.Annual_saving.text = str(Annual_saving)
            self.ids.Annual_saving_per.text = str(Annual_saving_per)
            self.ids.Annual_saving_SAR.text = str(Annual_saving_SAR)
            self.ids.Annual_saving_CO2.text = str(Annual_saving_CO2)

        except Exception as e:
            # self.ids.output.text = str(e)
            self.ids.output.text = 'Weather Data not Found!'


def select_countries():
    countries = []

    for file in os.listdir(r'WeatherFiles/'):
        y = pathlib.Path(file)
        countries.append(y.stem)
    return countries


class MyScreenManager(ScreenManager):
    FirstWindow: Screen
    SecondWindow: Screen
    ThirdWindow: Screen

    def __init__(self, **kwargs):
        super().__init__(**kwargs)


class EnergyApp(App):

    select_countries()
    countries = select_countries()


    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def build(self) -> MyScreenManager:

        self.root_layout = MyScreenManager()
        self.first_window = FirstWindow(name="first")
        self.second_window = SecondWindow(name="second")
        self.third_window = ThirdWindow(name="third")
        self.root_layout.add_widget(self.second_window, )
        self.root_layout.add_widget(self.third_window, )
        self.root_layout.add_widget(self.first_window, )
        return self.root_layout

    def on_start(self):
        pass
        self.root_layout.current = 'first'


if __name__ == "__main__":
    main_gui_app = EnergyApp()
    # what is the name of the kv file
    main_gui_app.kv_file = "EnergyApp_v_22_11_02.kv"
    main_gui_app.run()

You don't want to start the main application as a Thread. I think the best is to call a regular function in the .kv file and then in your Python code you can start a function as a Thread.

It is more straightforward to explicitly declare the filename in the code. I added the line to set the property kv_file directly.

What is going wrong when you start a thread in the function call that is executed from a kivy widget? Maybe the problem isn't related to that technique but some other issue.

Mark
  • 532
  • 1
  • 4
  • 9
  • Thank you very much for your comments. I implemented the modifications you suggested, however, nothing changed. 1. I removed the threading for the main application. 2. Calling regular function in .kv 3. implemented the lines you suggested. The problem still persists. When I run the code and call the function getdata() from .kv file, the GUI freezes until the function is executed. Same thing happens when I call the function inputs() from .kv file – zxcvb Nov 14 '22 at 06:32
  • ok, I can ,look closer. The threading technique is something I do a ton of in my applications and I have many in each application. If you want to try something different you can use kivy clock # dt means delta-time def my_callback(dt): pass # call my_callback as soon as possible (usually next frame.) Clock.schedule_once(my_callback) my_callback is of course your function. I sometimes use the clock scheduler but 99% use a thread for this exact same goal. – Mark Nov 14 '22 at 17:41
  • Thanks I will try kivy clock too. Can you suggest me some tutorials/references using such kind of operation? Your help is highly appreciated. Also, I am really confused why threading isn't working when I am using ScreenManager. I have developed one app with only one screen without screenmanager and it works fine. – zxcvb Nov 15 '22 at 12:19
  • I have done one linux/windows application with ScreenManager and KivyMD but all the other programs have not used ScreenManager. That said, I used Threading everywhere and I have not noticed any difference. I wouldn't expect any. Sorry, there aren't any tutorials that I have found to be a good single-source information on Kivy. I have learned by googling all over or by trying things. I would recommend not putting any threading calls directly in the .kv file. the .kv file should call a regular funcation and start the thread in your main widget or application code. – Mark Nov 16 '22 at 14:24
  • The issue is solved. Thanks very much for your help. I was making mistake in sending the args to the threading. – zxcvb Nov 17 '22 at 11:43