Hoe maak je een HTML-kalender dynamisch in Python

01 van 10

Invoering

De agendamodule van Python maakt deel uit van de standaardbibliotheek. Het staat de uitvoer van een kalender toe per maand of per jaar en biedt ook andere, kalender-gerelateerde functionaliteit.

De kalendermodule zelf is afhankelijk van de datetime-module. Maar we zullen datetime later ook voor onze eigen doeleinden nodig hebben, dus het is het beste om beide te importeren. Om de string te splitsen, hebben we ook de re- module nodig. Laten we ze allemaal in één keer importeren.

> importeer opnieuw, datetime, kalender

Standaard beginnen de kalenders de week met maandag (dag 0) volgens de Europese conventie en eindigt deze met zondag (dag 6). Als u zondag als eerste dag van de week verkiest , gebruikt u de methode setfirstweekday () om de standaardinstelling als volgt te wijzigen in dag 6:

> calendar.setfirstweekday (6)

Als u tussen deze twee wilt schakelen, kunt u de eerste dag van de week als argument doorgeven met behulp van de sys- module. U zou dan de waarde controleren met een if- instructie en de methode setfirstweekday () dienovereenkomstig instellen.

> import sys firstday = sys.argv [1] if firstday == "6": calendar.setfirstweekday (6)

02 van 10

De maanden van het jaar voorbereiden

In onze agenda zou het leuk zijn om een ​​koptekst te hebben voor de kalender die zoiets als "Een Python-gegenereerde agenda voor ..." leest en de huidige maand en het huidige jaar heeft. Om dit te doen, moeten we de maand en het jaar uit het systeem halen. Deze functionaliteit biedt de kalender , Python kan de maand en het jaar ophalen. Maar we hebben nog steeds een probleem. Omdat alle systeemdatums numeriek zijn en geen ongekorte of niet-numerieke vormen van de maanden bevatten, hebben we een lijst met die maanden nodig. Voer het lijstjaar in.

> jaar = ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december ']

Als we nu het nummer van een maand hebben, hebben we toegang tot dat nummer (minus één) in de lijst en krijgen we de volledige maandnaam.

03 of 10

Een dag genaamd "Vandaag"

Start de functie main () , laten we datetime voor die tijd vragen.

> def main (): today = datetime.datetime.date (datetime.datetime.now ())

Merkwaardig genoeg heeft de datetime- module een datetime- klasse. Het is van deze klasse die we twee objecten noemen: nu () en datum () . De methode datetime.datetime.now () retourneert een object dat de volgende informatie bevat: jaar, maand, datum, uur, minuut, seconde en microseconden. Natuurlijk hebben we de tijdinformatie niet nodig. Om alleen de datuminformatie uit te wissen, geven we de resultaten van now () door aan datetime.datetime.date () als argument. Het resultaat is dat vandaag nu het jaar, de maand en de datum worden gescheiden door em-streepjes.

04 van 10

De huidige datum splitsen

Om dit stukje gegevens in meer beheersbare stukjes te breken, moeten we het splitsen. We kunnen dan de delen toewijzen aan respectievelijk de variabelen current_yr , current_month en current_day .

> current = re.split ('-', str (vandaag)) current_no = int (current [1]) current_month = jaar [current_no-1] current_day = int (re.sub ('\ A0', '', huidig [2])) current_yr = int (current [0])

Om de eerste regel van deze code te begrijpen, werk van rechts naar links en van binnen naar buiten. Eerst moeten we het object vandaag nog strenger maken om het als een tekenreeks te gebruiken. Vervolgens splitsen we het met behulp van de em-dash als scheidingsteken of token. Ten slotte kennen we die drie waarden toe als een lijst met 'huidig'.

Om deze waarden duidelijker af te handelen en de lange naam van de huidige maand buiten het jaar te noemen, wijzen we het nummer van de maand toe aan current_no . We kunnen dan een beetje aftrekken in het subscript van het jaar en de naam van de maand toewijzen aan current_month .

In de volgende regel is een beetje vervanging nodig. De datum die uit datetime wordt teruggegeven, is een waarde van twee cijfers, zelfs voor de eerste negen dagen van de maand. Een nul fungeert als een plaatshouder, maar we hebben liever dat onze kalender slechts één cijfer heeft. Dus we vervangen geen waarde voor elke nul die een reeks begint (vandaar '\ A'). Ten slotte wijzen we het jaar toe aan current_yr en converteren het naar een geheel getal.

Methoden die we later zullen noemen, hebben invoer in een integer formaat nodig. Daarom is het belangrijk om ervoor te zorgen dat alle datuminformatie wordt opgeslagen in een integer, niet string, vorm.

05 van 10

De HTML- en CSS-preambule

Voordat we de kalender afdrukken, moeten we de HTML-preambule en CSS-lay-out voor onze agenda afdrukken. Ga naar deze pagina voor de code om de CSS- en HTML-preambule voor de kalender af te drukken. en kopieer de code naar uw programmabestand. De CSS in de HTML van dit bestand volgt de sjabloon die wordt aangeboden door Jennifer Kyrnin, About's Guide to Web Design. Als je dit deel van de code niet begrijpt, kun je haar hulp raadplegen voor het leren van CSS en HTML. Om de naam van de maand aan te passen, hebben we tot slot de volgende regel nodig:

> print '

>% s% s

> '% (current_month, current_yr)

06 van 10

De dagen van de week afdrukken

Nu de basislay-out is uitgevoerd, kunnen we de kalender zelf instellen. Een kalender, op het meest elementaire punt, is een tabel. Laten we dus een tabel maken in onze HTML:

> print '' '' ''

> Nu zal ons programma onze gewenste header met de huidige maand en het volgende jaar afdrukken. Als u de eerder genoemde opdrachtregeloptie hebt gebruikt, moet u hier een if-else- instructie invoegen als volgt:

>> if firstday == '0': print '' '

> Zondag > Maandag > Dinsdag > Woensdag > Donderdag > Vrijdag > Zaterdag

>> '' 'else: ## Hierbij gaan we uit van een binaire schakelaar, een keuze tussen' 0 'of niet' 0 '; daarom zorgt een niet-nulargument ervoor dat de kalender op zondag begint. print '' '

> Maandag > Dinsdag > Woensdag > Donderdag > Vrijdag > Zaterdag > Zondag

>> '' '

> Zondag > Maandag > Dinsdag > Woensdag > Donderdag > Vrijdag > Zaterdag

07 van 10

De kalendergegevens ophalen

Nu moeten we de eigenlijke kalender maken. Voor het ophalen van de werkelijke agendagegevens hebben we de methode monthcalendar () van de kalender nodig. Voor deze methode zijn twee argumenten nodig: het jaar en de maand van de gewenste kalender (beide in gehele getallen). Het geeft een lijst met lijsten met de datums van de maand per week. Dus als we het aantal items in de geretourneerde waarde tellen, hebben we het aantal weken in de opgegeven maand.

> month = calendar.monthcalendar (current_yr, current_no) nweeks = len (maand)

08 van 10

Het aantal weken in een maand

Als we het aantal weken in de maand kennen, kunnen we een for- lus maken die meetelt tussen een bereik () van 0 tot het aantal weken. Als dit het geval is, wordt de rest van de kalender afgedrukt.

> voor w in bereik (0, nweeks): week = maand [w] print "" voor x in xrange (0,7): dag = week [x] als x == 5 of x == 6: classtype = ' weekend 'anders: classtype =' dag 'als dag == 0: classtype =' vorige 'print' '% (classtype) elif dag == current_day: print' % s

> '% (classtype, dag, classtype) anders: print'% s

> '% (classtype, dag, classtype) afdrukken "" afdrukken' '' '' '

We zullen deze code regel voor regel bespreken op de volgende pagina.

09 van 10

De 'voor' Loop onderzocht

Nadat dit bereik is gestart, worden de datums van de week uit de maand gerekend volgens de waarde van de teller en toegewezen aan de week . Vervolgens wordt een tabelrij gemaakt om de kalenderdatums vast te houden.

Een for- lus loopt vervolgens door de dagen van de week, zodat ze kunnen worden geanalyseerd. De kalendermodule drukt een '0' af voor elke datum in de tabel die geen geldige waarde heeft. Een lege waarde zou beter werken voor onze doeleinden, dus we drukken de boekensteunen van tabelgegevens zonder waarde voor die datums af.

Als de dag de huidige is, moeten we deze op de een of andere manier benadrukken. Op basis van de td- klasse vandaag , zal de CSS van deze pagina ervoor zorgen dat de huidige datum wordt weergegeven tegen een donkere achtergrond in plaats van de lichte achtergrond van de andere datums.

Als de datum ten slotte een geldige waarde is en niet de huidige datum, wordt deze afgedrukt als tabelgegevens. De exacte kleurencombinaties hiervoor worden bewaard in de preambule in CSS-stijl.

De laatste regel van de eerste lus sluit de rij. Met de kalender afgedrukt is onze taak voltooid en kunnen we het HTML-document sluiten.

> print ""

10 van 10

De hoofdfunctie () oproepen

Omdat al deze code in de functie main () staat , vergeet dan niet om het te bellen.

> if __name__ == "__main__": main ()

Alleen deze eenvoudige kalender kan op elke manier worden gebruikt waarvoor een kalenderweergave nodig is. Door de datums in de HTML te koppelen, kunt u gemakkelijk een dagboekfunctionaliteit maken. Als alternatief kunt u een dagboekbestand controleren en vervolgens weergeven welke datums worden ingenomen door hun kleur. Of, als iemand dit programma converteert naar een CGI-script, kan het on-the-fly worden gegenereerd.

Dit is natuurlijk slechts een overzicht van de functionaliteit van de kalendermodule . De documentatie geeft een vollediger beeld.