Closed. This question is not reproducible or was caused by typos. It is not currently accepting answers.
This question was caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
Closed 2 years ago.
Improve this question
In python, I want a function to run at the same time as my normal script. I searched the internet and found threading, however, when I implement it and run the code, the error NameError: name 'datelabelstringvar' is not defined appears. I don't know what is wrong but when I remove threading and assign the function to a button (which I don't want just to be clear, I want it to be automatic), it works fine.
Code:
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
from numerize import numerize
import pygame
import os
import random
from datetime import datetime
import threading
import time
wholedate = datetime.date(datetime.now())
date = wholedate.strftime("%d")
month = wholedate.strftime("%m")
year = wholedate.strftime("%Y")
def advancetime():
global date
global month
global year
threading.Timer(5.0, advancetime).start()
if month == "09" or month == "04" or month == "06" or month == "11":
date = int(date) + 1
if date > 30:
date = 1
month = int(month) + 1
if month > 12:
month = 1
year = int(year) + 1
fixdate()
fixmonth()
datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))
return
if month == "01" or month == "03" or month == "05" or month == "07" or month == "08" or month == "10" or month == "12":
date = int(date) + 1
if date > 31:
date = 1
month = int(month) + 1
if month > 12:
month = 1
year = int(year) + 1
fixdate()
fixmonth()
datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))
return
if month == "02":
date = int(date) + 1
if date > 31:
date = 1
month = int(month) + 1
if month > 12:
month = 1
year = int(year) + 1
fixdate()
fixmonth()
datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))
def calendarOnClose():
root.deiconify()
calendarwindow.destroy()
def calendar():
global datelabelstringvar
global calendarwindow
root.withdraw()
calendarwindow = Toplevel()
calendarwindow.title("Calendar")
calendarwindow.geometry("400x350+300+100")
calendarwindow.protocol("WM_DELETE_WINDOW", calendarOnClose)
datelabelstringvar = StringVar()
datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))
datelabel = Label(calendarwindow, textvariable=datelabelstringvar).grid(row="0", column="0")
Button(calendarwindow, text="Advance Time", command=advancetime).grid(row="1", column="0")
totalfruitclickerstringvar = StringVar()
totalfruitclickerstringvar.set("Fruit Clicked: " + str(totalfruitclicked))
Label(calendarwindow, textvariable=totalfruitclickerstringvar).grid(row="2", column="0")
root = Tk()
root.title("Fruit Clicker")
root.geometry("400x350+300+100")
calendarbutton = Button(root, text="Calendar", fg="White", bg="Black", width="11", command=calendar)
calendarbutton.grid(row="8", column="0")
advancetime()
root.mainloop()
How do I fix this error? Thanks.
EDIT:
Full Error:
Traceback (most recent call last):
File "C:\Users\colli\Documents\GitHub\FruitClicker\windows\main.py", line 1708, in <module>
advancetime()
File "C:\Users\colli\Documents\GitHub\FruitClicker\windows\main.py", line 113, in advancetime
datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))
NameError: name 'datelabelstringvar' is not defined
Your code makes several references to a datelabelstringvar variable. However, you never define it. That's what Python is saying.
EDIT:
It doesn't appear that you ever call the calendar function where the variable is defined.
Related
I need to create multiple data frames that are slices of an original data frame called economy, but I want to create the data frames to refer to the month and the year that they correspond to. This is the while loop I have so far:
month = 1
year = 2016
while year < 2018:
while month < 13:
start = str(year) + '-' + str(month) + '-1'
if month == 2:
end = str(year) + '-' + str(month) + '-29'
elif month in (9,4,6,11):
end = str(year) + '-' + str(month) + '-30'
else:
end = str(year) + '-' + str(month) + '-31'
name = 'economy' + str(month) + '_' + str(year)
name = economy[start:end]
print(name)
month += 1
year += 1
but the loop is only adding every iteration to the data frame called name instead of creating a new one. I have tried to create a list of data frames for economy before the loop like below, but I don't know how to proceed to include it in the loop logic.
economy_list = []
for y in range(1,13):
name = 'economy' + str(y)
economy_list.append(name)
Thank you very much!
First, you need to use a dictionary for you sliced dataframes, and not a list, so that you can refer to each of them easily.
Second, as you know from the start how many "year"s and "month"es you will have, a for loop is the better option than a while loop.
So do:
economy_dict = {}
for year in range(2016, 2018):
for month in range(1, 13):
start = str(year) + '-' + str(month) + '-1'
if month == 2:
end = str(year) + '-' + str(month) + '-29'
elif month in (9,4,6,11):
end = str(year) + '-' + str(month) + '-30'
else:
end = str(year) + '-' + str(month) + '-31'
name = 'economy' + str(month) + '_' + str(year)
sliced = economy[start:end] #I copied from your code, but it doesn't seem right, and without sample of the data, I can't correct it if neccesary.
print(name)
economy_dict[name] = sliced
I am trying to program a calendar that checks how many days from now/ ago (past and present) from raw_input. I need a loop that counts the days through the current year and adds it to a variable called: Total_days and this loop has to go through each year until it hits the current date that the code ran on. The end result is that the output gives you the date you entered in a complete sentence: eg. "10/08/1700 was ___ days ago" Basically my teacher explained that the past days has to add up until it hits that certain date using a loop(loops are required. This is an assignment, i cant use any other functions like delta, but loops and datetime stuff is good!) and then for the future it has to say how many days from now until that futuristic date happens using loops. I am very stumped and i need your guys' help.
Heres what i got so far:
import datetime
input_date = raw_input("Enter in full format (mm/dd/yyyy):")
year = input_date[6:10]
yeara = int(year)
montha = int(input_date[1:2])
daya = int(input_date[4:5])
from datetime import datetime
from datetime import date
now = datetime.now()
year = now.year
month = now.month
day = now.day
def isleapYear(year):
if year % 4 == 0:
check = True
if year % 100 == 0:
check = False
if year % 400 == 0:
check = True
total_days = 0
n = 12
moNum = [0,31,28,31,30,31,30,31,31,30,31,30,31]
while n > montha:
if yeara > year:
if year == isleapYear(year):
total_days += 366
elif year != isleapYear(year):
total_days += 365
if montha == month:
break
total_days += int(moNum[n])
if n == 02:
if isleapYear(year) == True:
total_days += 1
n -= 1
ny = 365
h = total_days
if yeara > year:
if year == isleapYear(year):
total_days += 366
elif year != isleapYear(year):
total_days += 365
if yeara>year:
time = "future"
if yeara<year:
time = "past"
if yeara==year:
if montha>month:
time = "future"
if montha<month:
time = past
if montha == month:
if daya>day:
time = "future"
if daya<day:
time = "past"
if daya==day:
time = "present"
print str(h.days) + " days in the " + str(time)
Thanks for helping out! i appreciate your help :)
Must you use a loop? Else, you can build from the following:
refdatestr = "2010/08/23"
refdate = datetime.strptime(refdatestr, "%Y/%m/%d")
now = datetime.now()
difference_days = (now-refdate).days
difference_days is a datetime.timedelta object. If refdate (or refdatestr) was in the future, this would be negative.
Here is an updated code, with everything fixed:
import datetime
input_date = raw_input("Enter in full format (mm/dd/yyyy):")
year = input_date[6:10]
yeara = int(year)
montha = int(input_date[1:2])
daya = int(input_date[4:5])
from datetime import datetime
from datetime import date
now = datetime.now()
year = now.year
month = now.month
day = now.day
def isleapYear(year):
if year % 4 == 0:
check = True
if year % 100 == 0:
check = False
if year % 400 == 0:
check = True
end_date = input_date
start_date = now
delta = date(year,month,day)
delta2 = date(yeara,montha,daya)
h = delta-delta2
if yeara>year:
time = "future"
if yeara<year:
time = "past"
if yeara==year:
if montha>month:
time = "future"
if montha<month:
time = past
if montha == month:
if daya>day:
time = "future"
if daya<day:
time = "past"
if daya==day:
time = "present"
print str(h.days) + " in the " + str(time)
The most important thing that you forgot is that there are functions in datetime that will automatically find the number of days till the input...
Hope this helps!!!
def dateCalculationNorm(year):
a = year%19
b = year%4
c = year%7
d = (19*a + 24)%30
e = (2*b + 4*c + 6*d + 5)%7
dateNumber = 22 + d + e
return dateNumber
def dateCalculationSpecial(year):
a = year%19
b = year%4
c = year%7
d = (19*a + 24)%30
e = (2*b + 4*c + 6*d + 5)%7
dateNumber = 15 + d + e
return dateNumber
def dateOutput(year, date):
print("The date of Easter in the year {0} is {1}.".format(year, date))
def main():
print("Easter Date Calculator")
print()
year = eval(input("Enter the year: "))
if year >= 1900 and year <= 2099:
dateCalculationNorm(year)
if dateNumber > 31:
date = "April " + str(dateNumber - 31)
dateOutput(year, date)
else:
date = "March " + str(dateNumber)
dateOutput(year, date)
elif year == 1954 or year == 1981 or year == 2049 or year == 2076:
dateCalculationSpecial(year)
if dateNumber > 31:
date = "April " + str(dateNumber - 31)
dateOutput(year, date)
else:
date = "March " + str(dateNumber)
dateOutput(year, date)
else:
print("Sorry, but that year is not in the range of this program.")
if __name__ == '__main__':
main()
I am having trouble getting main() to accept dateNumber in the line following
(if year >= 1900 and year <=2099) Python is saying that dateNumber is not defined. I tried making dateNumber global at the beginning of the program and that worked (albeit with a warning from Python), but I know that's the sloppy way to get this program working.
Any help is very much appreciated.
You need to instantiate dateNumber.
if year >= 1900 and year <= 2099:
dateNumber = dateCalculationNorm(year) # Instantiate here.
if dateNumber > 31:
date = "April " + str(dateNumber - 31)
dateOutput(year, date)
else:
date = "March " + str(dateNumber)
dateOutput(year, date)
As it stands, there's nothing like that inside your main() function. There's no need to set it to a global either.
I know that this has been asked before, but I cant for the life of me understand it. I'm trying to create a simple program that gets two dates, and counts shows how many days are left between them.
This is my current code:
month = 0
day = 0
year = 0
def getDate(): #gets the current date
global month
global day
global year
print( 'What is the current month?' )
month = month + int(input())
print( 'What is the current day?' )
day = day + int(input())
print( 'What is the current year?' )
year = year + int(input())
print( 'The current date is ' + str(month) + '/' + str(day) + '/' + str(year) + '. Is this correct?' )
YESNO = input() #confirms date
if YESNO == 'YES' or YESNO == 'yes':
print( 'Okay.' )
else:
getDate()
newMonth = 0
newDay = 0
newYear = 0
def newDate(): #gets the desired countdown date
global newMonth
global newDay
global newYear
print( 'What is the desired countdown month?' )
newMonth = newMonth + int(input())
print( 'What is the desired countdown day?' )
newDay = newDay + int(input())
print( 'What is the desired countdown year?' )
newYear = newYear + int(input())
print( 'The desired countdown date is ' + str(newMonth) + '/' + str(newDay) + '/' + str(newYear) + '. Is this correct?' )
YESNO = input() #confirms date
if YESNO == 'YES' or YESNO == 'yes':
print( 'Okay.' )
else:
newDate()
def COUNTDOWN(): #prints countdown
global newMonth
global newDay
global newYear
global month
global day
global year
if newMonth < Month:
countDownMonth = int(Month) - int(newMonth)
else:
countDownMonth = int(newMonth) - int(Month)
if newDay < Day:
countDownDay = int(Day) - int(newDay)
else:
countDownDay = int(newDay) - int(Day)
if newMonth < Year:
countDownYear = int(Year) - int(newYear)
else:
countDownYear = int(newYear) - int(Year)
print( countDownMonth + '/' + countDownDay + '/' + countDownYear )
getDate()
newDate()
COUNTDOWN()
EDIT:
I apologize, I didn't realize it wasn't indented.
EDIT:
My question is how do I create a cross-function variable?
The global keyword in python is used to rebind a global variable in a local context. That being said, it is generally good practice to avoid the usage of the global keyword whenever possible.
In the code that you posted, it is necessary to use global in the functions getDate and newDate in order to bind those names in the global environment. However, in COUNTDOWN, because you are not rebinding the names and are only accessing the values bound to those names, global is not necessary.
For more information look here: Use of "global" keyword in Python
I just make your code workable as below:
month = 0
day = 0
year = 0
newMonth = 0
newDay = 0
newYear = 0
def getDate(): #gets the current date
global month
global day
global year
print( 'What is the current month?' )
month = month + int(input())
print( 'What is the current day?' )
day = day + int(input())
print( 'What is the current year?' )
year = year + int(input())
print( 'The current date is ' + str(month) + '/' + str(day) + '/' + str(year) + '. Is this correct?' )
YESNO = raw_input() #confirms date
print YESNO
if YESNO == 'YES' or YESNO == 'yes':
print( 'Okay.' )
else:
getDate()
def newDate(): #gets the desired countdown date
global newMonth
global newDay
global newYear
print( 'What is the desired countdown month?' )
newMonth = newMonth + int(input())
print( 'What is the desired countdown day?' )
newDay = newDay + int(input())
print( 'What is the desired countdown year?' )
newYear = newYear + int(input())
print( 'The desired countdown date is ' + str(newMonth) + '/' + str(newDay) + '/' + str(newYear) + '. Is this correct?' )
YESNO = raw_input() #confirms date
if YESNO == 'YES' or YESNO == 'yes':
print( 'Okay.' )
else:
newDate()
def COUNTDOWN(): #prints countdown
global newMonth
global newDay
global newYear
global month
global day
global year
if newMonth < month:
countDownMonth = int(month) - int(newMonth)
else:
countDownMonth = int(newMonth) - int(month)
if newDay < day:
countDownDay = int(day) - int(newDay)
else:
countDownDay = int(newDay) - int(day)
if newMonth < year:
countDownYear = int(year) - int(newYear)
else:
countDownYear = int(newYear) - int(year)
print( str(countDownMonth) + '/' + str(countDownDay) + '/' + str(countDownYear) )
getDate()
newDate()
COUNTDOWN()
In my env, this code is working, but i am not sure whether the output correct or not.
use the global keyword, like so:
def function():
global variable
this basically says, I want to access variable, even though I know it is global I still want it anyway.
Only use this if you are Changing the variable, not just using whatever is inside it.
e.g.,
def example():
global eg
eg = 1
Here we use global because we are changing eg's content. If we were to instead, USE eg's content to do something different we would do this:
def example(eg):
eg2 = eg
Here we are saying, 'I want to use the value that eg contains, but I dont want to change it'.
Then we have declared eg2 to be the same as eg, but we have not changed eg
If you wanted to then use the outcome of the function example, you would add a 'return' line.
def example(eg):
eg2 = eg
return eg
then we would call the function like so:
eg3 = example(eg)
This puts the result of example into eg3.
Hope this helps :)
I am trying to write a script that takes one argument and writes the output to the command window. For some reason I am getting the error:
NameError: name 'month' not defined
Here is the entire script:
import sys
hex = str(sys.argv)
sys.stdout.write (month(hex) + " " + day(hex) + ", " + year(hex) + " " + hour(hex) + ":" + minute(hex) + ":" + second(hex))
def year (hex):
year = int(hex[0:2], 16)
year = year + 1970
return str(year)
def month (hex):
month = int(hex[2:4], 16)
if month == 0:
month = "January"
return month
elif month == 1:
month = "February"
return month
elif month == 2:
month = "March"
return month
elif month == 3:
month = "April"
return month
elif month == 4:
month = "May"
return month
elif month == 5:
month = "June"
return month
elif month == 6:
month = "July"
return month
elif month == 7:
month = "August"
return month
elif month == 8:
month = "September"
return month
elif month == 9:
month = "October"
return month
elif month == 10:
month = "November"
return month
else:
month = "December"
return month
def day (hex):
day = int(hex[4:6], 16)
return str(day)
def hour (hex):
hour = int(hex[6:8], 16)
if hour < 10:
return "0" + str(hour)
else:
return str(hour)
def minute (hex):
minute = int(hex[8:10], 16)
if minute < 10:
return "0" + str(minute)
else:
return str(minute)
def second (hex):
second = int(hex[10:12], 16)
if minute < 10:
return "0" + str(second)
else:
return str(second)
When I used an online python interpreter to run it, the functions worked fine. I just don't know how to run it from the command line and send the output back to the command window. Thanks
In python a file is parsed line by line from top to bottom, so the functions month,year,hour,minute and second are not defined yet for this line:
sys.stdout.write (month(hex) + " " + day(hex) + ", " + year(hex) + " " + hour(hex) + ":" + minute(hex) + ":" + second(hex))
Move these function definitions above this line.
And using a local variable with same name as the function name is not a good idea.
As sys.argv returns a list (with first element being the filename), so you can't apply hex over it. Apply hex on the items of the list, i.e hex( int(sys.argv[1]) )
>>> lis = ['foo.py', '12']
>>> hex( int(lis[1]) ) #use `int()` as hex expects a number
'0xc'
Put the line sys.stdout.write... after your function definitions.
Please, don't use month for both your function and a variable inside this function.