Definition der allgemeinen Funktionen


In [1]:
#Prüft, ob ein Jahr ein Schaltjahr ist
def schaltjahr(jahr): #Bem.: ':' eröffnet "alles" (Schleifen, Funktionen, ...) [wie geschweifte Klammern in Java]
    if(jahr%400==0 or (jahr%4==0 and jahr%100!=0)):
        return 1
    else: return 0

#Bestimmt die Länge eines Monats
def monatslaenge(jahr,monat): #Übergaben "jahr", um Schaltjahre für Februar zu detektieren
    if(monat in [1,3,5,7,8,10,12]):
        return 31
    elif (monat in [4,6,9,11]): #=else if
        return 30
    elif(monat in [2] and schaltjahr(jahr)==1):
        return 29
    else: return 28  
    
#Bestimmt den Wochentag
#
# 0 - Sonntag, 1 - Montag, 2 - Dienstag, 3 - Mittwoch, 
# 4 - Donnerstag, 5 - Freitag, 6 - Samstag
def wochentag(jahr,monat,tag): 
    #"/" = mit Rest, "//" = ohne Rest, "%" = ohne Rest
    
    mkz  = [6,2,2,5,0,3,5,1,4,6,2,4] #Liste der Monatskennzahlen OHNE Schaltjahr
    mkzs = [5,1,2,5,0,3,5,1,4,6,2,4] #Liste der Monatskennzahlen MIT Schaltjahr
    
    c = jahr//100; #Anzahl der vergangenen Jahrhunderte
    j = jahr%100; # Jahreszahl innerhalb eines Jahrhunderts
    
    if (schaltjahr(jahr)==1): 
        k = mkzs[monat]
    else: 
        k = mkz[monat]
    #d = tag + k + j + j//4 - 2 * (c%4) 
    return (tag + k + j + j//4 - 2 * (c%4) )%7 

    #Python kennt keine Case-Switches > entweder "if" oder "options"
    #http://bytebaker.com/2008/11/03/switch-case-statement-in-python/
    
def feiertage(jahr):
    #result = [[]] #Format = [monat,tag,Name]
    
    #Ostersonntag
    k = jahr//100;
    m = 15 + (3 * k + 3)//4 - (8 * k + 13)//25
    s = 2 - (3 * k + 3)//4
    a = jahr % 19
    d = (19 * a + m) % 30
    r = d // 29 + (d//28 - d//29) * (a//11)
    og = 21 + d -r
    sz = 7 - (jahr + jahr//4 + s) % 7
    oe = 7 - (og - sz) % 7
    os = og + oe
    if (os>=1 and os<=31):
        result=[[3,os,'Ostersonntag']]
    else: result=[[4,(os-31),'Ostersonntag']]
    #print(result)
    
    #Weihnachtsfeiertage
    result+=[[12,25,'1. Weihnachtsfeiertag'],[12,26,'2. Weihnachtsfeiertag']]
    
    #1. Mai
    result+=[[5,1,'1. Mai']]
    
    # Tag der dt. Einheit
    result+=[[10,3,'Tag der dt. Einheit']]
    
    #Sortieren der Feiertage mittels "Minimum-steigt-ab"-Methode
    for tripel in range(0,len(result),1):
        #Vergleich mit dem Rest, hintertauschen
        for tripelrest in range(tripel+1,len(result),1):
            if(result[tripelrest][0]<result[tripel][0] or result[tripelrest][0]==result[tripel][0] and result[tripelrest][1]<result[tripel][1]):
                helper=result[tripelrest]
                result[tripelrest]=result[tripel]
                result[tripel]=helper
    return result
                
#mytest=feiertage(2015)
#print(mytest[0:])#[0:] gibt die gesamte Liste aus , ansonsten beachte: wird Endwert angenommen, wird er nicht ausgegeben

Hauptfunktion


In [2]:
#import calfunctions
from tkinter import *

#Main-File
#verwendet: schaltjahr(jahr), monatslaenge(jahr,monat), wochentag(jahr,monat,tag)
def kalender(jahr):

    #Listen für schnellen Zugrif auf Monatsname und Wochentag
    monatsname = ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember']
    tagnamelang = ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag']
    tagname = ['So','Mo','Di','Mi','Do','Fr','Sa']


    ##Erstellung der Fenster

    ##Fenster 1 für den Kalender
    ##Fenster 2 für die Feiertage
    
    fenster=Tk()
    fenster.title("Kalender des Jahres "+str(jahr))

    feiertagfenster=Tk()
    feiertagfenster.title("Feiertage des Jahres "+str(jahr))

    
     #============================================
     # Erzeugung Tabelle
     #============================================
    reihe=0
    
    for monat in range(0,12,1): #range(<Start>,<Ende>,>Schritt>) > Endwerte, die genau getroffen werden, werden nicht ausgegeben
        #header Monatsname + Tagliste
        ###print(monatsname[monat]) #default: print(monatsname[monat],end='\n')
        Label(text=monatsname[monat],width=15, relief=GROOVE, bg='green', fg='white').grid(row=reihe,column=0) ###beginnt bei 0, siehe Tage
        reihe+=1 ###hat null einfluss
        for tag in range(1,8,1):
            ###print(tagname[tag%7],end='\t')#if the Buffer doesn't work, add: ",flush=True"
            Label(text=tagname[tag%7],width=15, relief=GROOVE).grid(row=reihe, column=tag-1)
        ###print(end='\n')
        reihe+=1 ###wochdentagsüberschriften
        monatlang=monatslaenge(jahr,monat+1)#laenge des aktuellen monates

        
        #============================================
        #	Einträge in Tabelle
        #============================================     
        w = wochentag(jahr,monat,1)
            #fügt Leerzeichen ein vor erstem Eintrag in Monat
            ###BEACHTE COLUMN BEGINNEN BEI 0
        if (w!=1):
            if(w!=0):
                ###print('\t'*(w-1)+'1',end='')
                for i in range(0,w-1,1):
                    Label(text='',width=15, relief=GROOVE).grid(row=reihe, column=i)
                Label(text='1',width=15, relief=GROOVE).grid(row=reihe, column=w-1)
            else:
                ###print('\t'*6+'1',end='\n') #gibt 6* '\t' aus
                for i in range(0,6,1):
                    Label(text='',width=15, relief=GROOVE).grid(row=reihe, column=i)
                Label(text='1',width=15, relief=GROOVE).grid(row=reihe, column=6)#column6, da Sonntag
                reihe+=1
        else:
            ###print(str(1),end='')
            Label(text='1',width=15, relief=GROOVE).grid(row=reihe, column=0)#w-1 = Montag ist 1
        

        #schreibt die konsekutiven Wochentage  
        zaehler = 2
        for tag in range(2,monatlang+1,1): # Frage: was ist schneller? range(1,calfunctions.monatslaenge(monat))
            w+=1
            if(w%7==0): ###vorher Samstag, jetzt Sonntag
                ###print('\t'+str(zaehler),end='\n')
                Label(text=str(zaehler),width=15, relief=GROOVE).grid(row=reihe, column=w%7+6)
                reihe+=1
            elif (w%7==1):###vorher Sonntag, jetzt Montag
                ###print(str(zaehler),end='')
                Label(text=str(zaehler),width=15, relief=GROOVE).grid(row=reihe, column=w%7-1)
            else:
                ###print('\t'+str(zaehler),end='')
                ###dürfte no Need sein, da grid Label(text='',width=15, relief=GROOVE).grid(row=reihe, column=w%7)
                Label(text=str(zaehler),width=15, relief=GROOVE).grid(row=reihe, column=w%7-1)
            zaehler+=1
        reihe+=1 ###abstand nach letztem Wochentag
        ###print(end='\n\n')
    

     
    # Gibt die Feiertage aus
    
    ###Überschriften
    Label(feiertagfenster, text='Ereignis',width=20,bg='green',fg='white', relief=GROOVE).grid(row=0, column=0)
    Label(feiertagfenster, text='Tag',width=7,bg='green',fg='white', relief=GROOVE).grid(row=0, column=1)
    Label(feiertagfenster, text='Monat',width=15,bg='green',fg='white', relief=GROOVE).grid(row=0, column=2)
    
    feiertag = feiertage(jahr)
    for counter in range(0,len(feiertag),1):        
        ###print(feiertag[counter][2]+':\t'+str(feiertag[counter][1])+'. '+str(monatsname[feiertag[counter][0]-1]))
        name=feiertag[counter][2]
        tag=str(feiertag[counter][1])
        monat=str(monatsname[feiertag[counter][0]-1])

        
        Label(feiertagfenster, text=name,width=20, relief=GROOVE).grid(row=counter+2, column=0)
        Label(feiertagfenster, text=monat,width=15, relief=GROOVE).grid(row=counter+2, column=2)
        Label(feiertagfenster, text=tag,width=7, relief=GROOVE).grid(row=counter+2, column=1)
        #msg = Message(feiertage, text = ausgabe)
        #msg.config(bg='lightgreen', font=('times', 24, 'italic'))
        #msg.pack( )
    
    
    

    feiertagfenster.mainloop()
    fenster.mainloop()

In [3]:
kalender(2015)

Grafische Oberfläche


In [5]:
#Simple Gui
from tkinter import *
#alternativ: import tkinter as tk 
 #create window
fenster = Tk() #wäre dann: tk.Tk()

#modifiy root window
fenster.title("Simple GUI")
fenster.geometry("500x800") #width * height

#kick off the event loop 
#fenster.mainloop() #das 2. mainloop() würde nicht mehr ausgeführt

#w = Label(fenster,text="Hello Kahnor")
#w.pack() #pack() fügt zu aktiver GUI hinzu [ist wie "add"]
Label(fenster,text='Hier kommt der Kalender').pack()

textfeld=Text(fenster, height=600, width=300)
textfeld.pack()
ausgabe=str(kalender(2015))
textfeld.insert(END, ausgabe)


button = Button(fenster, text='Stop', width=25, command=fenster.destroy) #und z.B.: tk.Button(...)
button.pack()
fenster.mainloop()


Januar
Mo	Di	Mi	Do	Fr	Sa	So	
			1	2	3	4
5	6	7	8	9	10	11
12	13	14	15	16	17	18
19	20	21	22	23	24	25
26	27	28	29	30	31

Februar
Mo	Di	Mi	Do	Fr	Sa	So	
						1
2	3	4	5	6	7	8
9	10	11	12	13	14	15
16	17	18	19	20	21	22
23	24	25	26	27	28

März
Mo	Di	Mi	Do	Fr	Sa	So	
						1
2	3	4	5	6	7	8
9	10	11	12	13	14	15
16	17	18	19	20	21	22
23	24	25	26	27	28	29
30	31

April
Mo	Di	Mi	Do	Fr	Sa	So	
		1	2	3	4	5
6	7	8	9	10	11	12
13	14	15	16	17	18	19
20	21	22	23	24	25	26
27	28	29	30

Mai
Mo	Di	Mi	Do	Fr	Sa	So	
				1	2	3
4	5	6	7	8	9	10
11	12	13	14	15	16	17
18	19	20	21	22	23	24
25	26	27	28	29	30	31


Juni
Mo	Di	Mi	Do	Fr	Sa	So	
1
	2	3	4	5	6	7
8	9	10	11	12	13	14
15	16	17	18	19	20	21
22	23	24	25	26	27	28
29	30

Juli
Mo	Di	Mi	Do	Fr	Sa	So	
		1	2	3	4	5
6	7	8	9	10	11	12
13	14	15	16	17	18	19
20	21	22	23	24	25	26
27	28	29	30	31

August
Mo	Di	Mi	Do	Fr	Sa	So	
					1	2
3	4	5	6	7	8	9
10	11	12	13	14	15	16
17	18	19	20	21	22	23
24	25	26	27	28	29	30
31

September
Mo	Di	Mi	Do	Fr	Sa	So	
	1	2	3	4	5	6
7	8	9	10	11	12	13
14	15	16	17	18	19	20
21	22	23	24	25	26	27
28	29	30

Oktober
Mo	Di	Mi	Do	Fr	Sa	So	
			1	2	3	4
5	6	7	8	9	10	11
12	13	14	15	16	17	18
19	20	21	22	23	24	25
26	27	28	29	30	31

November
Mo	Di	Mi	Do	Fr	Sa	So	
						1
2	3	4	5	6	7	8
9	10	11	12	13	14	15
16	17	18	19	20	21	22
23	24	25	26	27	28	29
30

Dezember
Mo	Di	Mi	Do	Fr	Sa	So	
	1	2	3	4	5	6
7	8	9	10	11	12	13
14	15	16	17	18	19	20
21	22	23	24	25	26	27
28	29	30	31

Ostersonntag:	5. April
1. Mai:	1. Mai
Tag der dt. Einheit:	3. Oktober
2. Weihnachtsfeiertag:	24. Dezember
1. Weihnachtsfeiertag:	25. Dezember

In [1]:
"""from tkinter import *
class App:
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        self.button = Button(frame, 
                             text="QUIT", fg="red",
                             command=frame.quit)
        self.button.pack(side=LEFT)
        self.slogan = Button(frame,
                             text="Hello",
                             command=self.write_slogan)
        self.slogan.pack(side=LEFT)
    def write_slogan(self):
        print('Tkinter is easy to use!')

root = Tk()
app = App(root)
root.mainloop()"""


Out[1]:
'from tkinter import *\nclass App:\n    def __init__(self, master):\n        frame = Frame(master)\n        frame.pack()\n        self.button = Button(frame, \n                             text="QUIT", fg="red",\n                             command=frame.quit)\n        self.button.pack(side=LEFT)\n        self.slogan = Button(frame,\n                             text="Hello",\n                             command=self.write_slogan)\n        self.slogan.pack(side=LEFT)\n    def write_slogan(self):\n        print(\'Tkinter is easy to use!\')\n\nroot = Tk()\napp = App(root)\nroot.mainloop()'

In [5]:
from tkinter import*

"""
Kleiner test mit den verschiedenen Layout-Typen,
hier nur an einem Label, gefüllt mit farben.

Können wir für den Kalender gut nutzen für Feiertaganzeigen
"""

fenster=Tk()
fenster.title("Simple GUI")
fenster.geometry("500x800")
i=1
for count in range(1,11,1):
    if(i%2==0):
        w = Label(fenster, text=count, bg="red")
    #w.grid() #alle links untereinander
        w.pack(side=LEFT) #alle mittig untereinander
    else:
        w=Label(fenster, text=count, bg="green")
        w.pack(side=LEFT)
    i+=1


fenster.mainloop()

In [ ]: