Related
I have managed to program a simple python weather forecast that returns the weather results of the city which you entered. I followed a tutorial on Youtube.
I need your help to create a selecting menu for countries and cities that open weather supports. My instructor demanded me to make a choice menu instead of simple search bar.
I intended to approach the problem by creating json files that contain cities and their longitude, latitude. Each countries will have their own files. I can call the data from json files but I'm stumped on how to make the menu because I just started on IT and this is my first big project so I'd be delighted if you could help me solve it.
from string import capwords
import json
import PIL
import requests
from tkinter import *
import tkinter as tk
from tkinter import ttk, messagebox
from PIL import ImageTk
from PIL import Image
from geopy.geocoders import Nominatim
from datetime import *
import pytz
from timezonefinder import TimezoneFinder
root = Tk()
root.title("MerryWeather")
root.geometry("1000x500+300+300")
root.configure(bg = "#57adff")
root.resizable(False, False)
#Get weather information
def getWeather():
##Get timezone
city = searchText.get()
##Get city's coordinate
complete_api_link = "https://api.openweathermap.org/data/2.5/weather?q="+city+"&appid=####"
api_link = requests.get(complete_api_link)
api_data = api_link.json()
lonposition = api_data['coord']['lon']
latposition = api_data['coord']['lat']
long_lat.config(text = f"{round(latposition,4)}°N, {round(lonposition,4)}°E")
##Get current local time
obj = TimezoneFinder()
result = obj.timezone_at(lng = lonposition, lat = latposition)
timeZone.config(text = result)
local_time = pytz.timezone(result)
localTime = datetime.now(local_time)
currentTime = localTime.strftime("%I:%M %p")
clock.config(text = currentTime)
##Get weather information
apiURL = "https://api.openweathermap.org/data/2.5/onecall?lat="+str(latposition)+"&lon="+str(lonposition)+"&appid=####"
json_data = requests.get(apiURL).json()
temp = json_data['current']['temp'] - 273.15
humidity = json_data['current']['humidity']
pressure = json_data['current']['pressure']
wind_spd = json_data['current']['wind_speed']
weather_desc = json_data['current']['weather'][0]['description']
t.config(text = ("{:.2f}°C".format(temp)))
h.config(text = (humidity, "%"))
p.config(text = (pressure, "hPa"))
w.config(text = (wind_spd, "m/s"))
d.config(text = capwords(weather_desc))
##Show weekdays
###Day 1 info
first = datetime.now()
day1.config(text = first.strftime("%A"))
firsticon = json_data['daily'][0]['weather'][0]['icon']
icon1 = Image.open(f"images/{firsticon}.png")
resized1 = icon1.resize((130,130))
icon1r = ImageTk.PhotoImage(resized1)
day1icon.config(image = icon1r)
day1icon.image = icon1r
tempday1 = json_data['daily'][0]['temp']['day'] - 273.15
tempnight1 = json_data['daily'][0]['temp']['night'] - 273.15
day1temp.config(text = ("Day: {:.2f}°C\n".format(tempday1) + "Night: {:.2f}°C".format(tempnight1)))
###Day 2 info
second = first + timedelta(days = 1)
day2.config(text = second.strftime("%A"))
secondicon = json_data['daily'][1]['weather'][0]['icon']
icon2 = Image.open(f"images/{secondicon}.png")
resized2 = icon2.resize((80,80))
icon2r = ImageTk.PhotoImage(resized2)
day2icon.config(image = icon2r)
day2icon.image = icon2r
tempday2 = json_data['daily'][1]['temp']['day'] - 273.15
tempnight2 = json_data['daily'][1]['temp']['night'] - 273.15
day2temp.config(text = ("Day: {:.2f}°C\n".format(tempday2) + "Night: {:.2f}°C".format(tempnight2)))
###Day 3 info
third = first + timedelta(days = 2)
day3.config(text = third.strftime("%A"))
thirdicon = json_data['daily'][2]['weather'][0]['icon']
icon3 = Image.open(f"images/{thirdicon}.png")
resized3 = icon3.resize((80,80))
icon3r = ImageTk.PhotoImage(resized3)
day3icon.config(image = icon3r)
day3icon.image = icon3r
tempday3 = json_data['daily'][2]['temp']['day'] - 273.15
tempnight3 = json_data['daily'][2]['temp']['night'] - 273.15
day3temp.config(text = ("Day: {:.2f}°C\n".format(tempday3) + "Night: {:.2f}°C".format(tempnight3)))
###Day 4 info
fourth = first + timedelta(days = 3)
day4.config(text = fourth.strftime("%A"))
fourthicon = json_data['daily'][3]['weather'][0]['icon']
icon4 = Image.open(f"images/{fourthicon}.png")
resized4 = icon4.resize((80,80))
icon4r = ImageTk.PhotoImage(resized4)
day4icon.config(image = icon4r)
day4icon.image = icon4r
tempday4 = json_data['daily'][3]['temp']['day'] - 273.15
tempnight4 = json_data['daily'][3]['temp']['night'] - 273.15
day4temp.config(text = ("Day: {:.2f}°C\n".format(tempday4) + "Night: {:.2f}°C".format(tempnight4)))
###Day 5 info
fifth = first + timedelta(days = 4)
day5.config(text = fifth.strftime("%A"))
fifthicon = json_data['daily'][4]['weather'][0]['icon']
icon5 = Image.open(f"images/{fifthicon}.png")
resized5 = icon5.resize((80,80))
icon5r = ImageTk.PhotoImage(resized5)
day5icon.config(image = icon5r)
day5icon.image = icon5r
tempday5 = json_data['daily'][4]['temp']['day'] - 273.15
tempnight5 = json_data['daily'][4]['temp']['night'] - 273.15
day5temp.config(text = ("Day: {:.2f}°C\n".format(tempday5) + "Night: {:.2f}°C".format(tempnight5)))
###Day 6 info
sixth = first + timedelta(days = 5)
day6.config(text = sixth.strftime("%A"))
sixthicon = json_data['daily'][5]['weather'][0]['icon']
icon6 = Image.open(f"images/{sixthicon}.png")
resized6 = icon6.resize((80,80))
icon6r = ImageTk.PhotoImage(resized6)
day6icon.config(image = icon6r)
day6icon.image = icon6r
tempday6 = json_data['daily'][5]['temp']['day'] - 273.15
tempnight6 = json_data['daily'][5]['temp']['night'] - 273.15
day6temp.config(text = ("Day: {:.2f}°C\n".format(tempday6) + "Night: {:.2f}°C".format(tempnight6)))
###Day 7 info
seventh = first + timedelta(days = 6)
day7.config(text = seventh.strftime("%A"))
seventhicon = json_data['daily'][6]['weather'][0]['icon']
icon7 = Image.open(f"images/{seventhicon}.png")
resized7 = icon7.resize((80,80))
icon7r = ImageTk.PhotoImage(resized7)
day7icon.config(image = icon7r)
day7icon.image = icon7r
tempday7 = json_data['daily'][6]['temp']['day'] - 273.15
tempnight7 = json_data['daily'][6]['temp']['night'] - 273.15
day7temp.config(text = ("Day: {:.2f}°C\n".format(tempday7) + "Night: {:.2f}°C".format(tempnight7)))
#Interface
##Icon
image_icon = PhotoImage(file="images/01d.png")
root.iconphoto(False, image_icon)
##Current weather stats
Round_box1 = PhotoImage(file="images/rounded_bg1.png")
Label(root, image = Round_box1, bg = "#57adff").place(x = 30, y = 110)
temp = Label(root, text = "Temperature:", font = ('Helvetica', 11), fg = "white", bg = "#002167").place(x = 40, y = 115)
t = Label(root, font = ('Helvetica', 11), fg = "white", bg = "#002167")
t.place(x = 131, y = 115)
humid = Label(root, text = "Humidity :", font = ('Helvetica', 11), fg = "white", bg = "#002167").place(x = 40, y = 135)
h = Label(root, font = ('Helvetica', 11), fg = "white", bg = "#002167")
h.place(x = 131, y = 135)
pressure = Label(root, text = "Pressure :", font = ('Helvetica', 11), fg = "white", bg = "#002167").place(x = 40, y = 155)
p = Label(root, font = ('Helvetica', 11), fg = "white", bg = "#002167")
p.place(x = 131, y = 155)
wind = Label(root, text = "Wind speed :", font = ('Helvetica', 11), fg = "white", bg = "#002167").place(x = 40, y = 175)
w = Label(root, font = ('Helvetica', 11), fg = "white", bg = "#002167")
w.place(x = 131, y = 175)
desc = Label(root, text = "Description :", font = ('Helvetica', 11), fg = "white", bg = "#002167").place(x = 40, y = 195)
d = Label(root, font = ('Helvetica', 11), fg = "white", bg = "#002167")
d.place(x = 131, y = 195)
##City search box
searchField = PhotoImage(file="images/rounded_bg2.png")
search_field = Label(root, image = searchField, bg = "#57adff").place(x = 287, y = 130)
searchText = tk.Entry(root, justify = 'center', width = 15, font = ('Helvetica', 25, 'bold'), bg = "#414141", border = 0, fg = 'white')
searchText.place(x = 497, y = 150)
searchText.focus()
weatIcon = PhotoImage(file="images/logo.png")
weat_icon = Label(root, image = weatIcon, bg = "#414141").place(x = 317, y = 135)
searchIcon = PhotoImage(file="images/search.png")
search_icon = Button(root, image = searchIcon, borderwidth = 0, cursor = "hand2", bg = "#414141", command = getWeather).place(x = 887, y = 137)
##Big forecast box
bottomFrame = Frame(root, width = 1000, height = 200, bg = "#57adff")
bottomFrame.pack(side = BOTTOM)
Round_box3 = PhotoImage(file="images/rounded_bg3.png")
Label(bottomFrame, image = Round_box3, bg = "#57adff").place(x = -2, y = -5)
##Today weather box
todayWeat = PhotoImage(file="images/weather_box1.png")
Label(bottomFrame, image = todayWeat, bg = "#002060").place(x = 30, y = 23)
##Weather forecast box
weatForeBox = PhotoImage(file="images/weather_box2.png")
for x in range(6):
Label(bottomFrame, image=weatForeBox, bg="#002060").place(x=300 + x*115, y=23)
##Cell
###1st cell
first_cell = Frame(root, width = 240, height = 140, bg = "#303030").place(x = 37, y = 330)
day1icon = Label(root, bg = "#303030")
day1icon.place(x = 40, y = 330)
day1 = Label(root, font = ("Helvetica", 15), fg = "white", bg = "#303030")
day1.place(x = 165, y = 333)
day1temp = Label(root, font = ("Helvetica", 13), fg = "white", bg = "#303030")
day1temp.place(x = 161, y = 380)
###2nd cell
second_cell = Frame(root, width = 90, height = 140, bg = "#303030").place(x = 307, y = 330)
day2icon = Label(root, bg = "#303030")
day2icon.place(x = 310, y = 350)
day2 = Label(root, font = ("Helvetica", 11), fg = "white", bg = "#303030")
day2.place(x = 310, y = 333)
day2temp = Label(root, font = ("Helvetica", 10), fg = "white", bg = "#303030")
day2temp.place(x = 307, y = 430)
###3rd cell
third_cell = Frame(root, width = 90, height = 140, bg = "#303030").place(x = 422, y = 330)
day3icon = Label(root, bg = "#303030")
day3icon.place(x = 425, y = 350)
day3 = Label(root, font = ("Helvetica", 11), fg = "white", bg = "#303030")
day3.place(x = 425, y = 333)
day3temp = Label(root, font = ("Helvetica", 10), fg = "white", bg = "#303030")
day3temp.place(x = 422, y = 430)
###4th cell
fourth_cell = Frame(root, width = 90, height = 140, bg = "#303030").place(x = 537, y = 330)
day4icon = Label(root, bg = "#303030")
day4icon.place(x = 540, y = 350)
day4 = Label(root, font = ("Helvetica", 11), fg = "white", bg = "#303030")
day4.place(x = 540, y = 333)
day4temp = Label(root, font = ("Helvetica", 10), fg = "white", bg = "#303030")
day4temp.place(x = 537, y = 430)
###5th cell
fifth_cell = Frame(root, width = 90, height = 140, bg = "#303030").place(x = 652, y = 330)
day5icon = Label(root, bg = "#303030")
day5icon.place(x = 655, y = 350)
day5 = Label(root, font = ("Helvetica", 11), fg = "white", bg = "#303030")
day5.place(x = 655, y = 333)
day5temp = Label(root, font = ("Helvetica", 10), fg = "white", bg = "#303030")
day5temp.place(x = 652, y = 430)
###6th cell
sixth_cell = Frame(root, width = 90, height = 140, bg = "#303030").place(x = 767, y = 330)
day6icon = Label(root, bg = "#303030")
day6icon.place(x = 770, y = 350)
day6 = Label(root, font = ("Helvetica", 11), fg = "white", bg = "#303030")
day6.place(x = 770, y = 333)
day6temp = Label(root, font = ("Helvetica", 10), fg = "white", bg = "#303030")
day6temp.place(x = 767, y = 430)
###7th cell
seventh_cell = Frame(root, width = 90, height = 140, bg = "#303030").place(x = 882, y = 330)
day7icon = Label(root, bg = "#303030")
day7icon.place(x = 885, y = 350)
day7 = Label(root, font = ("Helvetica", 11), fg = "white", bg = "#303030")
day7.place(x = 885, y = 333)
day7temp = Label(root, font = ("Helvetica", 10), fg = "white", bg = "#303030")
day7temp.place(x = 882, y = 430)
##Time
clock = Label(root, font = ("Helvetica", 30, 'bold'), fg = "white", bg = "#57adff")
clock.place(x = 40, y =20)
##Timezone
timeZone = Label(root, font = ("Helvetica", 20), fg = "white", bg = "#57adff")
timeZone.place(x = 700, y = 20)
long_lat = Label(root, font = ("Helvetica", 10), fg = "white", bg = "#57adff")
long_lat.place(x = 700, y = 50)
#Launch
root.mainloop()
I'm also aware that my coding is horrendously unoptimized but as I said, I'm a newborn in this major so I can't modify it much without breaking everything and have to play "wack-a-mole" with bugs so any suggestion on how to optimize the program is also welcomed
from tkinter import *
import time
def checkTime():
if len(hourInput.get()) != 0 and len(minuteInput.get()) != 0 and len(secondInput.get()) != 0:
if hourInput.get() == time.strftime("%H"):
print("good")
window.after(500, checkTime)
def pressButton(button):
button.config(relief=SUNKEN)
if __name__=='__main__':
window = Tk()
window.geometry("1920x1080")
canvas = Canvas(window, width = 1980, height = 1020)
canvas.pack()
hourInput = StringVar()
minuteInput = StringVar()
secondInput = StringVar()
setHour = Entry(window, text = hourInput, font = (20))
setHour.place(x = 100, y = 20, width = 100, height = 40)
setMinute = Entry(window, text = minuteInput, font = (20))
setMinute.place(x = 300, y = 20, width = 100, height = 40)
setSecond = Entry(window, text = secondInput, font = (20))
setSecond.place(x = 500, y = 20, width = 100, height = 40)
canvas.create_text(60, 40, text = "Hour: ", font = (20))
canvas.create_text(260, 40, text = "Minute: ", font = (20))
canvas.create_text(460, 40, text = "Second: ", font = (20))
submit = Button(text = "Submit", height = 2, width = 10, font = (10))
submit.config(command = lambda submit=submit:pressButton(submit))
submit.place(x = 100, y = 100)
checkTime()
window.mainloop()
I want the function checkTime() to be called when my button is pressed. But how to get the status of my button and compare it ? I want to use the function only if the button is pressed as a test that the user agree with his inputs
You can modify the button declaration as follows so that the checkTime() will trigger when the button is pressed.
submit = Button(text = "Submit", height = 2, width = 10, font = (10), relief=SUNKEN)
submit['command'] = checkTime # no parentheses here
Also make sure that the checkTime() method call in the bottom is removed
I put the function checkTime() inside the pressButton() function, and now the program works fine.
from tkinter import *
import time
def checkTime():
if len(hourInput.get()) != 0 and len(minuteInput.get()) != 0 and len(secondInput.get()) != 0:
if hourInput.get() == time.strftime("%H"):
print("good")
window.after(500, checkTime)
def pressButton(button):
button.config(relief = SUNKEN)
checkTime()
if __name__== '__main__':
window = Tk()
window.geometry("1920x1080")
canvas = Canvas(window, width = 1980, height = 1020)
canvas.pack()
hourInput = StringVar()
minuteInput = StringVar()
secondInput = StringVar()
setHour = Entry(window, text = hourInput, font = (20))
setHour.place(x = 100, y = 20, width = 100, height = 40)
setMinute = Entry(window, text = minuteInput, font = (20))
setMinute.place(x = 300, y = 20, width = 100, height = 40)
setSecond = Entry(window, text = secondInput, font = (20))
setSecond.place(x = 500, y = 20, width = 100, height = 40)
canvas.create_text(60, 40, text = "Hour: ", font = (20))
canvas.create_text(260, 40, text = "Minute: ", font = (20))
canvas.create_text(460, 40, text = "Second: ", font = (20))
submit = Button(text = "Submit", height = 2, width = 10, font = (10))
submit.config(command = lambda submit=submit:pressButton(submit))
submit.place(x = 100, y = 100)
window.mainloop()
from tkinter import *
import time
check = False
window = Tk()
window.geometry("1920x1080")
def typeTime():
hour = int(time.strftime("%H"))
minute = int(time.strftime("%M"))
second = int(time.strftime("%S"))
hourInput2 = int(hourInput.get())
minuteInput2 = int(minuteInput.get())
secondInput2 = int(secondInput.get())
if(hour == hourInput2 and minute == minuteInput2 and second == secondInput2):
print("now")
global check
check = True
canvas = Canvas(window, width = 1980, height = 1020)
canvas.pack()
hourInput = StringVar()
minuteInput = StringVar()
secondInput = StringVar()
setHour = Entry(window, text = hourInput, font = (20)).place(x = 100, y = 20, width = 100, height = 40)
setMinute = Entry(window, text = minuteInput, font = (20)).place(x = 300, y = 20, width = 100, height = 40)
setSecond = Entry(window, text = secondInput, font = (20)).place(x = 500, y = 20, width = 100, height = 40)
canvas.create_text(60, 40, text = "Hour: ", font = (20))
canvas.create_text(260, 40, text = "Minute: ", font = (20))
canvas.create_text(460, 40, text = "Second: ", font = (20))
submit = Button(text = "Submit", height = 2, width = 10, font = (10), command = typeTime)
submit.place(x = 100, y = 100)
if check == True:
print("Pressed")
submit.config(relief = SUNKEN)
window.mainloop()
I'm trying to make a button to stay pressed, so I tried to make this happens with a global variable. The variable check is initially False, but when typeTime() is called via the submit object it should change its value in True and when check will be tested later to keep my button pressed using config method.
What am I doing wrong, as neither the button is still pressed nor the message "Pressed" is displayed in the console ?
The window.mainloop() is the internal loop inside object window, not in your script so that is why it didn't work. You need to add the action inside the function typeTime:
from tkinter import *
import time
if __name__=='__main__':
check = False
window = Tk()
window.geometry("1920x1080")
def typeTime(button):
hour = int(time.strftime("%H"))
minute = int(time.strftime("%M"))
second = int(time.strftime("%S"))
hourInput2 = int(hourInput.get())
minuteInput2 = int(minuteInput.get())
secondInput2 = int(secondInput.get())
if(hour == hourInput2 and minute == minuteInput2 and second == secondInput2):
print("now")
# global check
# check = True
print('Pressed')
button.config(relief=SUNKEN)
canvas = Canvas(window, width = 1980, height = 1020)
canvas.pack()
hourInput = StringVar()
minuteInput = StringVar()
secondInput = StringVar()
setHour = Entry(window, text = hourInput, font = (20)).place(x = 100, y = 20, width = 100, height = 40)
setMinute = Entry(window, text = minuteInput, font = (20)).place(x = 300, y = 20, width = 100, height = 40)
setSecond = Entry(window, text = secondInput, font = (20)).place(x = 500, y = 20, width = 100, height = 40)
canvas.create_text(60, 40, text = "Hour: ", font = (20))
canvas.create_text(260, 40, text = "Minute: ", font = (20))
canvas.create_text(460, 40, text = "Second: ", font = (20))
submit = Button(text = "Submit", height = 2, width = 10, font = (10))
submit.config(command = lambda submit=submit:typeTime(submit))
submit.place(x = 100, y = 100)
# if check == True:
# print("Pressed")
# submit.config(relief = SUNKEN)
window.mainloop()
when I sign in everything is fine and it takes me to the home page, when I click on view menu and then click the back button it takes me back to the home page, everything is still fine and the way I want however when I click on order menu and then press the back button to go back to the home page, my home page messes up and I see parts of "function:" function, how can i fix this?
I'm sorry if the code is a bit long I already cut out most of the unnecessary code (or tried to). Thank you for your help
from tkinter import*
from PIL import Image, ImageTk
import tkinter as tk
root = Tk()
root.geometry('670x466')
accounts = []
food = ['Pizza','Burger','Nachos', 'French Toast']
foodprice=['20','9.50','7.50', '17']
drinks = ['Pepsi','Lemonade','Tea', 'Aperitivo Spritz']
drinksprice = ['3','4','3', '15.50']
class Goode_brothers:
def __init__(self, parent):
self.myFrame = Frame(parent)
self.myFrame.pack()
self.load = Image.open('new-dip-project\\food.jpg')
self.render = ImageTk.PhotoImage(self.load)
self.img = Label(parent, image = self.render)
self.img.place(x = -26, y =0)
self.img_login = PhotoImage(file = 'new-dip-project\\button (3).png')
self.b1 = Button(parent,image = self.img_login, command = self.read_info, bd = 0, bg = '#3b353b', activebackground = '#3b353b')
self.b1.place(x = 275, y = 340)
self.img_register = PhotoImage(file = 'new-dip-project\\register.png')
self.b2 = Button(parent,image = self.img_register, command = self.openNewWindow, bd = 0, bg = '#3b353b', activebackground = '#3b353b')
self.b2.place(x = 265, y = 400)
self.canvas = Canvas(parent, width = 400, height = 120)
self.canvas.pack()
self.img4 = ImageTk.PhotoImage(Image.open('new-dip-project\\goode.png'))
self.canvas.create_image(20, 20, anchor=NW, image=self.img4)
self.email = Entry(parent)
self.email.place(x = 340, y = 180)
self.password = Entry(parent)
self.password.place(x = 354, y = 250)
self.img_label = PhotoImage(file = 'new-dip-project\\label-image.png')
self.name = Label(parent, image = self.img_label, text = "Email:", bg = '#3c3a3b').place(x = 197,y = 178)
self.img_label_pass = PhotoImage(file = 'new-dip-project\\label_pass.png')
self.name = Label(parent, image = self.img_label_pass, text = "Password:", bg = '#3c3a3b').place(x = 177,y = 245)
def openMenu(self):
for wid in root.winfo_children():
wid.destroy()
self.myFrame.destroy()
self.myFrame2 = Frame(root, bg = '')
self.myFrame2.pack(fill = "both", expand = 1)
self.img77 = PhotoImage(file = 'new-dip-project\\goode.png')
self.name77 = Label(self.myFrame2, image = self.img77).pack()
self.img_menu = PhotoImage(file = 'new-dip-project\\menu_button.png')
self.b6 = Button(self.myFrame2,image = self.img_menu, command = self.view_menu, bd = 0)
self.b6.place(x = 246, y = 140)
self.img_order = PhotoImage(file = 'new-dip-project\\order_button.png')
self.b7 = Button(self.myFrame2,image = self.img_order, command = self.order_menu, bd = 0)
self.b7.place(x = 239, y = 228)
self.img_checkout = PhotoImage(file = 'new-dip-project\\checkout.png')
self.b8 = Button(self.myFrame2,image = self.img_checkout, bd = 0)
self.b8.place(x = 250, y = 316)
def view_menu(self):
self.myFrame2.destroy()
self.myFrame3 = LabelFrame(root, height = 700)
self.myFrame3.pack()
self.myFrame3.columnconfigure(0, weight=1)
self.myFrame3.columnconfigure(1, weight=2)
self.food_title = Label(self.myFrame3, font=("Impact", "23"), text = 'Food').grid(row = 0, column = 4)
self.food_space = Label(self.myFrame3, text = '').grid(row = 1, column = 4)
self.drinks_title = Label(self.myFrame3, font=("Impact", "23"), text = 'Drinks').grid(row = 8, column = 4)
self.price = Label(self.myFrame3, font=("Impact", "23"), text = 'Price($)').grid(row = 0, column = 8)
for x in range (len(food)):
self.foodop = Label(self.myFrame3, font=("Impact", "15"), text = food[x]).grid(row = 3+x, column = 4) #A created label defining where it is positioned
self.fprice = Label(self.myFrame3, font=("Impact", "15"), text = foodprice[x]).grid(row = 3+x, column = 8)
for x in range (len(drinks)):
self.drinksop = Label(self.myFrame3, font=("Impact", "15"), text = drinks[x]).grid(row = 5+(len(food))+x, column = 4)
self.drinksp = Label(self.myFrame3, font=("Impact", "15"), text = drinksprice[x]).grid(row = 5+(len(food))+x, column = 8)
self.img_back = PhotoImage(file = 'new-dip-project\\back_button.png')
self.b10 = Button(self.myFrame3,image = self.img_back, command = self.openMenu, bd = 0)
self.b10.grid(row = 38, column = 7)
def order_menu(self):
for wid2 in root.winfo_children():
wid2.destroy()
self.myFrame2.destroy()
self.myFrame4 = Frame(root)
self.myFrame4.pack(fill = "both", expand = 1)
self.tkvar = StringVar(self.myFrame4)
self.tkvar.set("Food")
self.tkvar2 = StringVar(self.myFrame4)
self.tkvar2.set("Drinks")
self.img_odmenu = PhotoImage(file = 'new-dip-project\\od_menu.png')
self.order_menu_message = Label(self.myFrame4, image = self.img_odmenu).place(x = 220)
self.foodMenu = OptionMenu(self.myFrame4, self.tkvar, *food)
self.foodMenu.place(x = 160, y = 110)
self.Foodlabel = Label(self.myFrame4, text="Choose Your Food", font=("Courier New","12"))
self.Foodlabel.place(x = 145, y = 83)
self.drinklabel = Label(self.myFrame4, text="Choose Your Drink", font=("Courier New","12"))
self.drinklabel.place(x = 370, y = 83)
self.drinkMenu = OptionMenu(self.myFrame4, self.tkvar2, *drinks)
self.drinkMenu.place(x = 385, y = 110)
self.pricelabel = Label(self.myFrame4, text = "Total price", font=("Courier New","12"))
self.pricelabel.place(x = 289, y = 208)
self.order_btn78 = PhotoImage(file = 'new-dip-project\\orderb.png')
self.order_btn = Button(self.myFrame4, image = self.order_btn78, bd = 0)
self.order_btn.place(x = 302, y = 160)
self.check_btn = PhotoImage(file = 'new-dip-project\\checkpay.png')
self.checkout_btn = Button(self.myFrame4, image = self.check_btn, bd = 0)
self.checkout_btn.place(x = 267, y = 410)
self.img_odmenu = PhotoImage(file = 'new-dip-project\\od_menu.png')
self.order_menu_message = Label(self.myFrame4, image = self.img_odmenu).place(x = 220)
self.foodMenu = OptionMenu(self.myFrame4, self.tkvar, *food)
self.foodMenu.place(x = 160, y = 110)
self.Foodlabel = Label(self.myFrame4, text="Choose Your Food", font=("Courier New","12"))
self.Foodlabel.place(x = 145, y = 83)
self.drinklabel = Label(self.myFrame4, text="Choose Your Drink", font=("Courier New","12"))
self.drinklabel.place(x = 370, y = 83)
self.drinkMenu = OptionMenu(self.myFrame4, self.tkvar2, *drinks)
self.drinkMenu.place(x = 385, y = 110)
self.pricelabel = Label(self.myFrame4, text = "Total price", font=("Courier New","12"))
self.pricelabel.place(x = 289, y = 208)
self.order_btn78 = PhotoImage(file = 'new-dip-project\\orderb.png')
self.order_btn = Button(self.myFrame4, image = self.order_btn78, bd = 0)
self.order_btn.place(x = 302, y = 160)
self.check_btn = PhotoImage(file = 'new-dip-project\\checkpay.png')
self.checkout_btn = Button(self.myFrame4, image = self.check_btn, bd = 0)
self.checkout_btn.place(x = 267, y = 410)
self.back_menu = PhotoImage(file = 'new-dip-project\\bbutton.png')
self.back_button2 = Button(self.myFrame4, image = self.back_menu, command = self.openMenu, bd = 0)
self.back_button2.place(x = 30, y = 410)
if __name__ == "__main__":
e = Goode_brothers(root)
root.title('Goode brothers')
root.mainloop()
You have to indent the methods under the class Goode Brothers
in the following code is an issue, which I can't find.
The Error:
AttributeError: 'game' object has no attribute 'tk'
I guess it's because the field-function.
The functions, which are important for my program are shown in the following code.
import tkinter as tkinter
from tkinter import *
# class for the game
class game(tkinter.Frame):
def __init__(self):
# main-window
self.root = tkinter.Tk()
# title
self.root.title("TicTacToe")
# text member
self.text = tkinter.StringVar()
self.text.set(" ")
# config
self.root.geometry("178x130")
self.root.resizable(width=0, height=0)
self.root['bg'] = '#1c6796'
self.root.iconphoto(True, tkinter.PhotoImage(file=r'C:\Users\nicod\Desktop\TicTacToe\icon.png'))
# buttons
self.singleplayer_button = Button(self.root, text = "Singleplayer", command = self.singleplayer_window, font = 'Times 10 italic')
self.multiplayer_button = Button(self.root, text = "Multiplayer", command = self.multiplayer_window, font = 'Times 10 italic')
self.quit_button = Button(self.root, text = "Quit", command = quit, font = 'Times 10 italic')
self.singleplayer_button.place(x = 48, y = 10)
self.multiplayer_button.place(x = 51, y = 50)
self.quit_button.place(x = 70, y = 90)
self.root.mainloop()
def quit(self):
self.root.destroy()
def field(self):
# 9 buttons for the field
self.field1 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field2 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field3 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field4 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field5 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field6 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field7 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field8 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field9 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.back = tkinter.Button(self, text = 'back', command = quit, font = 'Times 10 italic')
# display buttons
self.field1.place(x = 50, y = 10)
self.field2.place(x = 100, y = 10)
self.field3.place(x = 150, y =10)
self.field4.place(x = 50, y = 60)
self.field5.place(x = 100, y = 60)
self.field6.place(x = 150, y = 60)
self.field7.place(x = 50, y = 120)
self.field8.place(x = 100, y = 120)
self.field9.place(x = 150, y = 120)
self.back.place (x = 50, y = 180)
self.reset.place (x = 150, y = 180)
def singleplayer_window(self):
self.sw = tkinter.Toplevel()
self.sw.title("Singleplayer")
# config
self.sw.geometry("240x210")
self.sw.resizable(width=0, height=0)
self.sw.iconphoto(True, tkinter.PhotoImage(file=r'C:\Users\nicod\Desktop\TicTacToe\icon.png'))
# draw the field
self.field()
self.sw.mainloop()
I hope you can help me!
PS: I let out the Multiplayer-function, because it's similar to the singleplayer-funtion.
btw: It was the first time I really worked with classes, so please don't blame me!
You never initialise tkinter.Frame using super().__init__(self.root)
Look at this:
import tkinter as tkinter
from tkinter import *
# class for the game
class Game(tkinter.Frame):
def __init__(self):
# main-window
self.root = tkinter.Tk()
# title
self.root.title("TicTacToe")
# text member
self.text = tkinter.StringVar()
self.text.set(" ")
# config
self.root.geometry("178x130")
self.root.resizable(width=0, height=0)
self.root['bg'] = '#1c6796'
self.root.iconphoto(True, tkinter.PhotoImage(file=r'C:\Users\nicod\Desktop\TicTacToe\icon.png'))
# buttons
self.singleplayer_button = Button(self.root, text = "Singleplayer", command = self.singleplayer_window, font = 'Times 10 italic')
self.multiplayer_button = Button(self.root, text = "Multiplayer", command = self.multiplayer_window, font = 'Times 10 italic')
self.quit_button = Button(self.root, text = "Quit", command = quit, font = 'Times 10 italic')
self.singleplayer_button.place(x = 48, y = 10)
self.multiplayer_button.place(x = 51, y = 50)
self.quit_button.place(x = 70, y = 90)
self.root.mainloop()
def quit(self):
self.root.destroy()
def field(self):
# 9 buttons for the field
self.field1 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field2 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field3 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field4 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field5 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field6 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field7 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field8 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field9 = tkinter.Button(self, textvariable=self.text, command = self.move, height = 2, width = 4)
self.back = tkinter.Button(self, text = 'back', command = quit, font = 'Times 10 italic')
# display buttons
self.field1.place(x = 50, y = 10)
self.field2.place(x = 100, y = 10)
self.field3.place(x = 150, y =10)
self.field4.place(x = 50, y = 60)
self.field5.place(x = 100, y = 60)
self.field6.place(x = 150, y = 60)
self.field7.place(x = 50, y = 120)
self.field8.place(x = 100, y = 120)
self.field9.place(x = 150, y = 120)
self.back.place (x = 50, y = 180)
self.reset.place (x = 150, y = 180)
def singleplayer_window(self):
self.sw = tkinter.Toplevel()
self.sw.title("Singleplayer")
super().__init__(self.sw) # Initialise the frame
super().pack() # `pack`/`grid`/`place` the frame
# config
self.sw.geometry("240x210")
self.sw.resizable(width=0, height=0)
self.sw.iconphoto(True, tkinter.PhotoImage(file=r'C:\Users\nicod\Desktop\TicTacToe\icon.png'))
# draw the field
self.field()
self.sw.mainloop()
app = Game()
That will cause problems if you call singleplayer_window multiple times as # BryanOakley said. That is why I think you shouldn't inherit from tkinter.Frame so:
import tkinter as tkinter
from tkinter import *
# class for the game
class Game:
def __init__(self):
# main-window
self.root = tkinter.Tk()
# title
self.root.title("TicTacToe")
# text member
self.text = tkinter.StringVar()
self.text.set(" ")
# config
self.root.geometry("178x130")
self.root.resizable(width=0, height=0)
self.root['bg'] = '#1c6796'
self.root.iconphoto(True, tkinter.PhotoImage(file=r'C:\Users\nicod\Desktop\TicTacToe\icon.png'))
# buttons
self.singleplayer_button = Button(self.root, text = "Singleplayer", command = self.singleplayer_window, font = 'Times 10 italic')
self.multiplayer_button = Button(self.root, text = "Multiplayer", command = self.multiplayer_window, font = 'Times 10 italic')
self.quit_button = Button(self.root, text = "Quit", command = quit, font = 'Times 10 italic')
self.singleplayer_button.place(x = 48, y = 10)
self.multiplayer_button.place(x = 51, y = 50)
self.quit_button.place(x = 70, y = 90)
self.root.mainloop()
def quit(self):
self.root.destroy()
def field(self):
# 9 buttons for the field
self.field1 = tkinter.Button(self.frame, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field2 = tkinter.Button(self.frame, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field3 = tkinter.Button(self.frame, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field4 = tkinter.Button(self.frame, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field5 = tkinter.Button(self.frame, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field6 = tkinter.Button(self.frame, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field7 = tkinter.Button(self.frame, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field8 = tkinter.Button(self.frame, textvariable=self.text, command = self.move, height = 2, width = 4)
self.field9 = tkinter.Button(self.frame, textvariable=self.text, command = self.move, height = 2, width = 4)
self.back = tkinter.Button(self.frame, text = 'back', command = quit, font = 'Times 10 italic')
# display buttons
self.field1.place(x = 50, y = 10)
self.field2.place(x = 100, y = 10)
self.field3.place(x = 150, y =10)
self.field4.place(x = 50, y = 60)
self.field5.place(x = 100, y = 60)
self.field6.place(x = 150, y = 60)
self.field7.place(x = 50, y = 120)
self.field8.place(x = 100, y = 120)
self.field9.place(x = 150, y = 120)
self.back.place (x = 50, y = 180)
self.reset.place (x = 150, y = 180)
def singleplayer_window(self):
self.sw = tkinter.Toplevel()
self.sw.title("Singleplayer")
self.frame = tkinter.Frame(self.sw) # Initialise the frame
self.frame.pack() # `pack`/`grid`/`place` the frame
# config
self.sw.geometry("240x210")
self.sw.resizable(width=0, height=0)
self.sw.iconphoto(True, tkinter.PhotoImage(file=r'C:\Users\nicod\Desktop\TicTacToe\icon.png'))
# draw the field
self.field()
self.sw.mainloop()
app = Game()
You should add self.tk = some_value in your class, because there is really no attribute tk. Or maybe you meant self.root