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
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)
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()
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]:
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 [ ]: