0
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()
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
  • 1
    You 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

0 Answers0