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"