import tkinter as tk
import os
from tkinter import ttk, Canvas
from PIL import Image, ImageTk
from Weather import WeatherPredictions as wp
from SecondaryFunctions import Functions as f
class ImageFrame(tk.Frame):
def __init__(self, container):
super().__init__(container)
self.__create_widgets()
def __create_widgets(self):
os.chdir(r'C:\Users\milos\OneDrive\Dokumenty\GitHub\Weather-forecast\images')
img = Image.open("weather.png")
smaller_image = img.resize((390,300), Image.LANCZOS)#ANTIALIS
self.img1 = ImageTk.PhotoImage(smaller_image)
tk.Label(self, image = self.img1).grid()
class PlaceName(tk.Frame):
def __init__(self, container):
super().__init__(container)
self.columnconfigure(0,weight=1)
self.__create_widgets()
def __create_widgets(self):
current_weather = wp.current_weather()
place_name = current_weather[0]
tk.Label(self, text=place_name, font = ('Ubuntu' , 25)).grid(column=0, row=0, sticky=tk.NSEW, pady=20)
class WeatherImage(tk.Frame):
def __init__(self, container):
super().__init__(container)
self.__create_widgets()
def __create_widgets(self):
current_weather = wp.current_weather()
weather_code, wind_speed = current_weather[1], current_weather[4]
os.chdir(r'C:\Users\milos\OneDrive\Dokumenty\GitHub\Weather-forecast\images')
img = Image.open(f.weather_code_encoding(weather_code, wind_speed))
smaller_image = img.resize((250,200), Image.LANCZOS)#ANTIALIS
self.img1 = ImageTk.PhotoImage(smaller_image)
tk.Label(self, image = self.img1).grid()
class WeatherData(tk.Frame):
def __init__(self, container):
super().__init__(container)
self.__create_widgets()
def __create_widgets(self):
current_weather = wp.current_weather()
temperature,wind_speed,precipitation_probability = current_weather[2],current_weather[3],current_weather[4]
tk.Label(self, text='Temperature: ').grid(row=0)
tk.Label(self, text=str(temperature)+'℃').grid(row=1)
tk.Label(self, text='Precipitation probability: ').grid(row=2)
tk.Label(self, text=str(precipitation_probability)+'%').grid(row=3)
tk.Label(self, text='Wind Speed').grid(row=4)
tk.Label(self, text=str(wind_speed)+'km/h').grid(row=5)
class HourlyWeather(ttk.Frame):
def __init__(self, container):
super().__init__(container)
self.__create_widgets()
def __create_widgets(self):
hourly_weather_data = wp.hourly_weather([51.22,19.3])
time,weather_code,temperature,precipitation_probability,windspeed = hourly_weather_data[1], hourly_weather_data[2], hourly_weather_data[3], hourly_weather_data[4], hourly_weather_data[5]
tk.Label(self, text='Hour: ').grid(column=0, row=0)
tk.Label(self, text='Weather_code: ').grid(column=0, row=1)
tk.Label(self, text='Temperature: ').grid(column=0, row=2)
tk.Label(self, text='Precipitation probability: ').grid(column=0, row=3)
tk.Label(self, text='Wind speed: ').grid(column=0, row=4)
self.img0, self.img1,self.img2,self.img3,self.img4,self.img5,self.img6,self.img7,self.img8,self.img9,self.img10,self.img11 = f.weather_code_encoding2(weather_code[0], windspeed[0],25,25),f.weather_code_encoding2(weather_code[1], windspeed[1],25,25),f.weather_code_encoding2(weather_code[2], windspeed[2],25,25), f.weather_code_encoding2(weather_code[3], windspeed[3],25,25), f.weather_code_encoding2(weather_code[4], windspeed[4],25,25), f.weather_code_encoding2(weather_code[5], windspeed[5],25,25), f.weather_code_encoding2(weather_code[6], windspeed[6],25,25), f.weather_code_encoding2(weather_code[7], windspeed[7],25,25), f.weather_code_encoding2(weather_code[8], windspeed[8],25,25), f.weather_code_encoding2(weather_code[9], windspeed[9],25,25), f.weather_code_encoding2(weather_code[10], windspeed[10],25,25), f.weather_code_encoding2(weather_code[11], windspeed[11],25,25)
for i in range(6):
self.rowconfigure(i, weight=1)
for i in range(len(time)):
self.columnconfigure(i, weight=1)
tk.Label(self, text=f.converter_date_into_hour2(time[i])).grid(column=i+1, row=0)
tk.Label(self, image=eval('self.img' + str(i))).grid(column=i+1, row=1)
tk.Label(self, text=temperature[i]).grid(column=i+1, row=2)
tk.Label(self, text=precipitation_probability[i]).grid(column=i+1, row=3)
tk.Label(self, text=windspeed[i]).grid(column=i+1, row=4)
class WeeklyWeather(ttk.Frame):
def __init__(self, container):
super().__init__(container)
self.__create_widgets()
def __create_widgets(self):
weekly_weather_data = wp.week_weather([51.22,19.3])
time,weather_code,temperature,precipitation_probability,windspeed = weekly_weather_data[1], weekly_weather_data[2], weekly_weather_data[3], weekly_weather_data[4], weekly_weather_data[5]
tk.Label(self, text='Date: ').grid(column=0, row=0)
tk.Label(self, text='Weather_code: ').grid(column=0, row=1)
tk.Label(self, text='Temperature: ').grid(column=0, row=2)
tk.Label(self, text='Precipitation probability: ').grid(column=0, row=3)
tk.Label(self, text='Wind speed: ').grid(column=0, row=4)
self.img0, self.img1,self.img2,self.img3,self.img4,self.img5,self.img6 = f.weather_code_encoding2(weather_code[0], windspeed[0],25,25),f.weather_code_encoding2(weather_code[1], windspeed[1],25,25),f.weather_code_encoding2(weather_code[2], windspeed[2],25,25), f.weather_code_encoding2(weather_code[3], windspeed[3],25,25), f.weather_code_encoding2(weather_code[4], windspeed[4],25,25), f.weather_code_encoding2(weather_code[5], windspeed[5],25,25), f.weather_code_encoding2(weather_code[6], windspeed[6],25,25)
for i in range(len(time)):
self.columnconfigure(i, weight=1)
tk.Label(self, text=time[i]).grid(column=i+1, row=0)
tk.Label(self, image=eval('self.img' + str(i))).grid(column=i+1, row=1)
tk.Label(self, text=temperature[i]).grid(column=i+1, row=2)
tk.Label(self, text=precipitation_probability[i]).grid(column=i+1, row=3)
tk.Label(self, text=windspeed[i]).grid(column=i+1, row=4)
class TwoWeekWeather(ttk.Frame):
def __init__(self, container):
super().__init__(container)
self.__create_widgets()
def __create_widgets(self):
two_week_weather_data = wp.two_week_weather([51.22,19.3])
time,weather_code,temperature,precipitation_probability,windspeed = two_week_weather_data[1], two_week_weather_data[2], two_week_weather_data[3], two_week_weather_data[4], two_week_weather_data[5]
tk.Label(self, text='Date: ').grid(column=0, row=0)
tk.Label(self, text='Weather_code: ').grid(column=0, row=1)
tk.Label(self, text='Temperature: ').grid(column=0, row=2)
tk.Label(self, text='Precipitation probability: ').grid(column=0, row=3)
tk.Label(self, text='Wind speed: ').grid(column=0, row=4)
self.img0, self.img1,self.img2,self.img3,self.img4,self.img5,self.img6,self.img7,self.img8,self.img9,self.img10,self.img11,self.img12,self.img13 = f.weather_code_encoding2(weather_code[0], windspeed[0],25,25),f.weather_code_encoding2(weather_code[1], windspeed[1],25,25),f.weather_code_encoding2(weather_code[2], windspeed[2],25,25), f.weather_code_encoding2(weather_code[3], windspeed[3],25,25), f.weather_code_encoding2(weather_code[4], windspeed[4],25,25), f.weather_code_encoding2(weather_code[5], windspeed[5],25,25), f.weather_code_encoding2(weather_code[6], windspeed[6],25,25), f.weather_code_encoding2(weather_code[7], windspeed[7],25,25), f.weather_code_encoding2(weather_code[8], windspeed[8],25,25), f.weather_code_encoding2(weather_code[9], windspeed[9],25,25), f.weather_code_encoding2(weather_code[10], windspeed[10],25,25), f.weather_code_encoding2(weather_code[11], windspeed[11],25,25), f.weather_code_encoding2(weather_code[12], windspeed[12],25,25),f.weather_code_encoding2(weather_code[13], windspeed[13],25,25),
for i in range(len(time)):
self.columnconfigure(i, weight=1)
tk.Label(self, text=f.date_shortener(time[i])).grid(column=i+1, row=0)
tk.Label(self, image=eval('self.img' + str(i))).grid(column=i+1, row=1)
tk.Label(self, text=temperature[i]).grid(column=i+1, row=2)
if precipitation_probability[i] != None:
tk.Label(self, text=precipitation_probability[i]).grid(column=i+1, row=3)
else:
tk.Label(self, text='soon').grid(column=i+1, row=3)
tk.Label(self, text=windspeed[i]).grid(column=i+1, row=4)
class BottomFrame(ttk.Frame):
def __init__(self, container):
super().__init__(container)
self.__create_widgets()
def __create_widgets(self):
self.rowconfigure(0, weight=1)
tk.Label(self, text='Thanks for using our weather forecast!', font = ('Ubuntu' , 25)).grid(row=0, sticky=tk.NSEW)
class EntryButtons(ttk.Frame):
def __init__(self, container):
super().__init__(container)
self.container = container
self.city_value = tk.StringVar()
self.state_value = tk.StringVar()
self.country_value = tk.StringVar()
self.type_of_weather = tk.StringVar()
self.__create_widgets()
def __create_widgets(self):
city_entry = tk.Entry(self, textvariable=self.city_value)
state_entry = tk.Entry(self, textvariable=self.state_value)
country_entry = tk.Entry(self, textvariable=self.country_value)
self.weather_type = ttk.Combobox(self, textvariable=self.type_of_weather, state='readonly')
self.weather_type['values'] = ('HourlyWeather', 'WeeklyWeather', 'TwoWeekWeather')
self.weather_type.current(0)
tk.Label(self, text='City: ').grid(column=0, row=0)
city_entry.grid(column=1, row=0)
tk.Label(self, text='State: ').grid(column=2, row=0)
state_entry.grid(column=3, row=0)
tk.Label(self, text='Country: ').grid(column=4, row=0)
country_entry.grid(column=5, row=0)
self.weather_type.grid(column=6, row=0)
self.weather_type.bind('<<ComboboxSelected>>', self.container.show_frame(self.type_of_weather.get()))
class app(tk.Tk):
def __init__(self):
super().__init__()
os.chdir(r'C:\Users\milos\OneDrive\Dokumenty\GitHub\Weather-forecast\images')
self.title('Weather forecast')
self.iconbitmap("icon.ico")
self.geometry('800x500+50+50')
self.resizable(0, 0)
self.configure(bg='deepskyblue')
self.columnconfigure(0, weight=2)
self.columnconfigure(1,weight=2)
self.columnconfigure(2,weight=4)
self.frames = {}
self.__create_widgets()
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
def __create_widgets(self):
place_name_frame = PlaceName(self)
place_name_frame.grid(column = 0, row = 0, columnspan=2, sticky=tk.NSEW)
weather_image_frame = WeatherImage(self)
weather_image_frame.grid(column=0, row=1, sticky=tk.W)
weather_data_frame = WeatherData(self)
weather_data_frame.grid(column=1, row=1, sticky=tk.NSEW)
image_frame = ImageFrame(self)
image_frame.grid(column = 2, row = 0, sticky=tk.E,rowspan=2)
for F in (HourlyWeather, WeeklyWeather, TwoWeekWeather):
page_name = F.__name__
frame = F(container=self)
self.frames[page_name] = frame
frame.grid(column = 0, row = 3, columnspan=3, sticky=tk.NSEW)
self.entry_buttons = EntryButtons(container=self)
self.entry_buttons.grid(column = 0, row = 2, sticky=tk.W,columnspan=3, pady=5)
self.show_frame("HourlyWeather")
bottom_frame = BottomFrame(self)
bottom_frame.grid(column = 0, row = 4, columnspan=3, sticky=tk.NS, pady=8)
if __name__ == "__main__":
app1 = app()
app1.mainloop()
Asked
Active
Viewed 13 times
0

codester_09
- 5,622
- 2
- 5
- 27

Ravs0nek
- 1
- 1
-
Please try to reduce the amount of code. See [mcve]. There seems to be a lot of code there that isn't necessary for reproducing the problem. – Bryan Oakley Jun 23 '23 at 16:36
-
1You are binding the combobox change event to *the result of calling `show_frame()` yourself* - nothing happens when the event occurs, because that function didn't return anything, and you therefore bound the event to None. You have to bind to a *function* - `lambda *args: self.container.show_frame(self.type_of_weather.get())` perhaps - so that it can be called in response to the event. – jasonharper Jun 23 '23 at 16:37