from tkinter import *
import tkinter.ttk as ttk
import time
import calendar
import sqlite3
tek_god=time.strftime('%Y')
tek_mes=time.strftime('%m')
tek_den=time.strftime('%d')
root=Tk()
root.title('Ежедневник')
root.geometry('280x300+100+100')
spiski=Frame(root)
nadp1=Label(spiski,text='Год')
spisok_god=ttk.Combobox(spiski,height=6,
values=[2019,2020,2021,2022,2023,2024])
spisok_god.set(tek_god)
nadp2=Label(spiski,text='Месяц')
mesyaci=['январь','февраль','март','апрель','май','июнь','июль','август',
'сентябрь','октябрь','ноябрь','декабрь']
spisok_mesyac=ttk.Combobox(spiski,height=12,values=mesyaci)
spisok_mesyac.set(mesyaci[int(tek_mes)-1])
tablica=Canvas(width=280,height=260,bg='gray80')
spiski.grid(row=0,column=1)
tablica.grid(row=1,column=1)
nadp1.grid(row=0,column=1)
spisok_god.grid(row=0,column=2)
nadp2.grid(row=1,column=1)
spisok_mesyac.grid(row=1,column=2)
#nach_perioda=[]
def perechen_del(event):
item=tablica.find_closest(event.x,event.y)
nomer_dnya=tablica.gettags(item)[0]
nomer=int(nomer_dnya)
if mesyac=='март' or mesyac=='август':
data_vibor=nomer_dnya+' '+mesyac+'а'+' '+god_str+' года'
elif mesyac!='март' and mesyac!='август':
data_vibor=nomer_dnya+' '+mesyac[:-1]+'я'+' '+god_str+' года'
#tablica.itemconfig(event.widget,fill='red')
window=Toplevel(root)
window.geometry('800x530+390+100')
window.title(data_vibor)
zapisi=Frame(window,bd=10)
zapisi.grid(row=0,column=1)
knopka=Button(window,bg='white',text='''С
о
х
р
а
н
и
т
ь''',font='Roman 14')
knopka.grid(row=0,column=2)
chas_nach=0
min_nach=0
m=1
#global nach_perioda
for n in range(48):
min_con=min_nach+30
if min_con==60:
chas_con=chas_nach+1
min_con=0
else:
chas_con=chas_nach
if chas_nach<10:
chas_nach_str='0'+str(chas_nach)
else:
chas_nach_str=str(chas_nach)
if chas_con<10:
chas_con_str='0'+str(chas_con)
else:
chas_con_str=str(chas_con)
if min_nach==0:
min_nach_str=str(min_nach)+'0'
else:
min_nach_str=str(min_nach)
if min_con==0:
min_con_str=str(min_con)+'0'
else:
min_con_str=str(min_con)
nadp_zapisi=Label(zapisi,text='{0}.{1}-{2}.{3}'.\
format(chas_nach_str,min_nach_str,\
chas_con_str,min_con_str))
#elem_nach_perioda='{0}.{1}'.format(chas_nach_str,min_nach_str)
#nach_perioda.append(elem_nach_perioda)
min_nach=min_con
chas_nach=chas_con
if n>23:
n=n-24
m=3
nadp_zapisi.grid(row=n,column=m)
kluch=god*1000000+mesyac_chislo*10000+nomer*100
dannie=sqlite3.connect('baza.db')
cur=dannie.cursor()
cur.execute('SELECT*FROM perechen')
b=cur.fetchall()
dannie.commit()
cur.close()
dannie.close()
j=2
for i in range(48):
znach1=StringVar()
delo=Entry(zapisi,textvariable=znach1,width=35)
t=i
if t>23:
t=t-24
j=4
delo.grid(row=t,column=j)
for elem in b:
#for n in range(2):
if elem[0]==kluch+i+1:
stroka=elem[1]
znach1.set(stroka)
def vvod(event):
nonlocal kluch
dannie=sqlite3.connect('baza.db')
cur=dannie.cursor()
cur.execute('SELECT*FROM perechen')
b=cur.fetchall()
j=2
for y in range(48):
t=y
if t>23:
t=t-24
j=4
widget=zapisi.grid_slaves(row=t,column=j)[0]
slova=widget.get()
a=(kluch+y+1,slova)
n=0
for elem in b:
#for i in range(2):
if elem[0]==kluch+y+1:
n=1
if n!=1:
sql_a="INSERT INTO perechen VALUES(?,?)"
cur.execute(sql_a,a)
elif n==1:
cur.execute('UPDATE perechen SET znach=? WHERE id_perechen=?',\
(slova,kluch+y+1))
dannie.commit()
cur.close()
dannie.close()
knopka.bind('<Button-1>',vvod)
def obnovl_kalendar(e=None):
tablica.delete('all')
global mesyaci
global god
global mesyac_chislo
global god_str
global mesyac
god=int(spisok_god.get())
god_str=spisok_god.get()
mesyac=spisok_mesyac.get()
mesyac_chislo=mesyaci.index(mesyac)+1
c=calendar.Calendar(0)
kalendar=c.monthdayscalendar(god, mesyac_chislo)
x=0;y=0
for n in range(7):
dni=tablica.create_rectangle(x,y,x+40,y+20,fill="white")
x=x+40
y=y+20
for i in range(6):
x=0
for j in range(7):
kletka=tablica.create_rectangle(x,y,x+40,y+40,fill="white")
x=x+40
y=y+40
dni_nedeli=['Пн','Вт','Ср','Чт','Пт','Сб','Вс']
x=10;y=10
for elem in dni_nedeli:
tablica.create_text(x,y,text=elem,anchor="w",font='Roman 12',
justify=CENTER,fill="black")
x=x+40
y=40
for elem in kalendar:
x=10
for elem1 in elem:
if elem1==0:elem1=''
elif elem1<10:elem1=' '+str(elem1)
chislo=tablica.create_text(x,y,text=elem1,anchor="w",
font='Roman 12',justify=CENTER,
fill='black',tag=elem1)
if god==int(tek_god) and mesyac_chislo==int(tek_mes)\
and elem1==' '+str(int(tek_den)):
tablica.itemconfig(chislo,fill="red",font='Roman 14')
if god==int(tek_god) and mesyac_chislo==int(tek_mes)\
and elem1==str(int(tek_den)):
tablica.itemconfig(chislo,fill="red",font='Roman 14')
tablica.tag_bind(chislo,'<Button-1>',perechen_del)
x=x+40
y=y+40
obnovl_kalendar()
spisok_god.bind('<<ComboboxSelected>>', obnovl_kalendar)
spisok_mesyac.bind('<<ComboboxSelected>>', obnovl_kalendar)
#Создаем список дел на текущую дату для дальнейшего вывода сообщения о событии
nach_perioda=[]
chas_nach=0
min_nach=0
for n in range(48):
if min_nach==60:
chas_nach=chas_nach+1
min_nach=0
if chas_nach<10:
chas_nach_str='0'+str(chas_nach)
else:
chas_nach_str=str(chas_nach)
if min_nach==0:
min_nach_str=str(min_nach)+'0'
else:
min_nach_str=str(min_nach)
min_nach=min_nach+30
elem_nach_perioda='{0}.{1}'.format(chas_nach_str,min_nach_str)
nach_perioda.append(elem_nach_perioda)
kluch_tek=int(tek_god)*1000000+int(tek_mes)*10000+int(tek_den)*100
dannie=sqlite3.connect('baza.db')
cur=dannie.cursor()
cur.execute('SELECT*FROM perechen')
b=cur.fetchall()
dannie.commit()
cur.close()
dannie.close()
stroki=[]
for i in range(48):
for elem in b:
if elem[0]==kluch_tek+i+1:
stroki.append(elem[1])
spisok_tek_del=list(zip(nach_perioda,stroki))
print(spisok_tek_del)
def uvedoml_o_sobit():
for elem_spisok in spisok_tek_del:
if time.strftime("%H.%M")==elem_spisok[0] and elem_spisok[1]!='':
okno_soobshenia=Tk()
okno_soobshenia.title('Уведомление о событии')
okno_soobshenia.geometry('280x300+500+500')
Image=PhotoImage(file='Будильник.gif')
kartinka=Label(okno_soobshenia,image=Image)
kartinka.pack()
soobshenie=Label(okno_soobshenia,text=elem_spisok[1],height=10,width=20)
soobshenie.pack()
knopka_oznakoml=Button(okno_soobshenia,text='OK',height=2,width=20)
knopka_oznakoml.pack()
def oznakomlen(event):
okno_soobshenia.destroy()
knopka_oznakoml.bind('<Button-1>',oznakomlen)
root.after(36000,uvedoml_o_sobit)
root.after(36000,uvedoml_o_sobit)
root.mainloop()