Automatisierte Notenvergabe bei Klausuren

ToolV00.py 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. # genutzte Module
  2. from Tkinter import *
  3. import sys
  4. import os
  5. # Globale Variablen
  6. name = ""
  7. date = ""
  8. PunkteProAufgabe = []
  9. zaehler = 1
  10. ProzentSatz = 0
  11. Summe = 0
  12. BestehPunkte = 0
  13. minEins = 0
  14. minZwei = 0
  15. minDrei = 0
  16. Studenten = []
  17. StudentenPunkte = []
  18. Notenverteilung = []
  19. # Funktionsdefinitionen
  20. # interaktive Abfrage der Eckdaten (Name und Datum) der Klausur
  21. def SchluesselDatenAbfragen():
  22. def WerteUebernehmen():
  23. global name
  24. global date
  25. name = entry1.get()
  26. date = entry2.get()
  27. root.destroy()
  28. def VerbergeHilfeName():
  29. button3.config(text = "Hilfe", fg = "green", command = ZeigeHilfeName)
  30. def ZeigeHilfeName():
  31. button3.config(text = "Beachte: _ anstatt Leerzeichen", command = VerbergeHilfeName)
  32. def VerbergeHilfeDatum():
  33. button2.config(text = "Hilfe", fg = "green", command = ZeigeHilfeDatum)
  34. def ZeigeHilfeDatum():
  35. button2.config(text = "Format: DD-MM-JJJJ", command = VerbergeHilfeDatum)
  36. root = Tk()
  37. root.title("Name und Datum")
  38. Label(root, text = "Name der Klausur").grid(row = 0, column = 0)
  39. Label(root, text = "Datum der Klausur").grid(row = 1, column = 0)
  40. entry1 = Entry(root)
  41. entry2 = Entry(root)
  42. entry1.grid(row = 0, column = 1, pady = 4)
  43. entry2.grid(row = 1, column = 1, pady = 4)
  44. entry1.insert(10,"Klausur")
  45. entry2.insert(10,"01-01-2000")
  46. button1 = Button(root, text = "Uebernehmen", command = WerteUebernehmen)
  47. button2 = Button(root, text = "Hilfe", fg = "green", command = ZeigeHilfeDatum)
  48. button3 = Button(root, text = "Hilfe", fg = "green",command = ZeigeHilfeName)
  49. button1.grid(row = 3, column = 1)
  50. button2.grid(row = 1, column = 2)
  51. button3.grid(row = 0, column = 2)
  52. root.mainloop()
  53. # interktive Abfrage der fuer jede Aufgabe erreichbaren maximalen Punkte
  54. def AufgabenPunkteAbfragen():
  55. def VerbergeHilfe():
  56. button1.config(text = "Hilfe", fg = "green", command = ZeigeHilfe)
  57. def ZeigeHilfe():
  58. button1.config(text = "Anzahl Punkte fuer jede Aufgabe eintragen", command = VerbergeHilfe)
  59. def NaechsteAufgabeEinlesen():
  60. global zaehler
  61. zaehler += 1
  62. tmp = "Aufgabe",str(zaehler)
  63. label1.config(text = tmp, font = "Arial 10")
  64. entry1.delete(0,END)
  65. entry1.insert(10,"10")
  66. button1.config(text = "Hilfe", fg = "green", command = ZeigeHilfe)
  67. button2.config(text = "Weiter", command = EndeAbfragen)
  68. def EndeAbfragen():
  69. global PunkteProAufgabe
  70. if 0.0 < float(entry1.get()):
  71. PunkteProAufgabe.append(float(entry1.get()))
  72. label1.config(text = "Waren das alle Aufgaben?", font = "Arial 13 bold")
  73. button1.config(text = "Ja", fg = "black", command = root.destroy)
  74. button2.config(text = "Nein", command = NaechsteAufgabeEinlesen)
  75. root = Tk()
  76. tmp = "Aufgabe",str(zaehler)
  77. root.title("Punkte fuer einzelne Aufgaben")
  78. label1 = Label(root, text = tmp)
  79. Label(root, text = "Erreichbare Punkte").grid(row = 1, column = 0)
  80. label1.grid(row = 0, column = 1)
  81. entry1 = Entry(root)
  82. entry1.grid(row = 1, column = 1, pady = 4)
  83. entry1.insert(10,"10")
  84. button1 = Button(root, text = "Hilfe", fg = "green", command = ZeigeHilfe)
  85. button2 = Button(root, text = "Weiter", command = EndeAbfragen)
  86. button1.grid(row = 3, column = 0)
  87. button2.grid(row = 3, column = 1)
  88. root.mainloop()
  89. # interaktive Abfrage eines Prozentsatzes fuer Mindestpunktzahl zum Bestehen
  90. def MindestPunktzahlAbfragen():
  91. def WertUebernehmen():
  92. global ProzentSatz
  93. ProzentSatz = float(entry1.get())
  94. root.destroy()
  95. root = Tk()
  96. root.title("Prozentsatz zum Bestehen")
  97. Label(root, text = "Prozentsatz").grid(row = 0, column = 0)
  98. entry1 = Entry(root)
  99. entry1.grid(row = 0, column = 1)
  100. entry1.insert(10,"50")
  101. button1 = Button(root, text = "Uebernehmen", command = WertUebernehmen)
  102. button1.grid(row = 1, column = 1)
  103. root.mainloop()
  104. # errechnet die jeweiligen Mindestpunkte, die fuer die Noten 1, 2, 3 benoetigt werden
  105. def BewertungsSpiegelBerechnen():
  106. global PunkteProAufgabe
  107. global ProzentSatz
  108. global Summe
  109. global BestehPunkte
  110. global minEins
  111. global minZwei
  112. global minDrei
  113. for i in range(len(PunkteProAufgabe)):
  114. Summe += PunkteProAufgabe[i]
  115. BestehPunkte = Summe * ProzentSatz/100
  116. tmp = Summe - BestehPunkte
  117. tmp /= 4
  118. minEins = Summe - tmp
  119. minZwei = minEins - tmp
  120. minDrei = minZwei - tmp
  121. # interaktives Abfragen der individuellen Punkte der Studenten je Aufgabe
  122. def StudentenMaskeGenerieren():
  123. def VerbergeHilfe():
  124. button1.config(text = "Hilfe", fg = "green", command = ZeigeHilfe)
  125. def ZeigeHilfe():
  126. button1.config(text = "Beachte: _ anstatt Leerzeichen", command = VerbergeHilfe)
  127. def NaechstenStudentEinlesen():
  128. label1.config(text = "Name", font = "Arial 10")
  129. label2.config(text = "Matrikelnummer", font = "Arial 10")
  130. entry1.delete(0,END)
  131. entry2.delete(0,END)
  132. entry1.insert(10,"Max_Mustermann")
  133. entry2.insert(10,"9999999")
  134. for i in range(zaehler):
  135. entries[i].delete(0,END)
  136. entries[i].insert(10,PunkteProAufgabe[i])
  137. button1.config(text = "Hilfe", fg = "green", command = ZeigeHilfe)
  138. button2.config(text = "Uebernehmen", command = UebernehmeStudent)
  139. def UebernehmeStudent():
  140. global Studenten
  141. global StudentenPunkte
  142. tmpStudentenDaten = []
  143. tmpPunkte = []
  144. tmpStudentenDaten.append(int(entry2.get()))
  145. tmpStudentenDaten.append(entry1.get())
  146. Studenten.append(tmpStudentenDaten)
  147. tmpPunkte.append(int(entry2.get()))
  148. for i in range(zaehler):
  149. if float(entries[i].get()) <= float(PunkteProAufgabe[i]) and 0.0 <= float(entries[i].get()):
  150. tmpPunkte.append(float(entries[i].get()))
  151. else:
  152. tmpPunkte.append(0.0)
  153. StudentenPunkte.append(tmpPunkte)
  154. label1.config(text = "Waren das alle", font = "Arial 12 bold")
  155. label2.config(text = "Studenten?", font = "Arial 12 bold")
  156. button1.config(text = "Ja", fg = "black", command = root.destroy)
  157. button2.config(text = "Nein", command = NaechstenStudentEinlesen)
  158. global PunkteProAufgabe
  159. root = Tk()
  160. root.title("Studentendaten")
  161. label1 = Label(root, text = "Name", font = "Arial 10")
  162. label2 = Label(root, text = "Matrikelnummer", font = "Arial 10")
  163. label1.grid(row = 0, column = 0)
  164. label2.grid(row = 1, column = 0)
  165. Label(root, text = "Aufgabe").grid(row = 2, column = 0)
  166. Label(root, text = "Erreichte Punkte").grid(row = 2, column = 1)
  167. entry1 = Entry(root)
  168. entry2 = Entry(root)
  169. entry1.grid(row = 0, column = 1, pady = 4)
  170. entry2.grid(row = 1, column = 1, pady = 4)
  171. entry1.insert(10,"Max_Mustermann")
  172. entry2.insert(10,"9999999")
  173. entries = []
  174. for i in range(zaehler):
  175. tmp = str(i+1)
  176. Label(root, text = tmp).grid(row = 3+i, column = 0)
  177. entries.append(Entry(root))
  178. entries[i].grid(row = 3+i, column = 1, pady = 4)
  179. entries[i].insert(10,PunkteProAufgabe[i])
  180. button1 = Button(root, text = "Hilfe", fg = "green", command = ZeigeHilfe)
  181. button2 = Button(root, text = "Uebernehmen", command = UebernehmeStudent)
  182. button1.grid(row = 0, column = 2)
  183. button2.grid(row = 1, column = 2)
  184. root.mainloop()
  185. PunkteProAufgabe = []
  186. # Berechnung der Noten anhand der Punkte fuer jeden Studenten
  187. def GesamtNoteBerechnen():
  188. global Summe
  189. global Studenten
  190. global StudentenPunkte
  191. global minEins
  192. global minZwei
  193. global minDrei
  194. global BestehPunkte
  195. for i in range(len(Studenten)):
  196. tmpSumme = 0
  197. for j in range(1,len(StudentenPunkte[i])):
  198. tmpSumme += StudentenPunkte[i][j]
  199. if tmpSumme < BestehPunkte:
  200. Studenten[i].append(5.0)
  201. elif tmpSumme < minDrei:
  202. Studenten[i].append(4.0 + 1 - float(int(10 * ((tmpSumme - BestehPunkte) / (minDrei - BestehPunkte)))) / 10.0)
  203. elif tmpSumme < minZwei:
  204. Studenten[i].append(3.0 + 1 - float(int(10 * ((tmpSumme - minDrei) / (minZwei - minDrei)))) / 10.0)
  205. elif tmpSumme < minEins:
  206. Studenten[i].append(2.0 + 1 - float(int(10 * ((tmpSumme - minZwei) / (minEins - minZwei)))) / 10.0)
  207. else:
  208. Studenten[i].append(1.0 + 1 - float(int(10 * ((tmpSumme - minEins) / (Summe - minEins)))) / 10.0)
  209. Summe = 0
  210. minEins = 0
  211. minZwei = 0
  212. minDrei = 0
  213. BestehPunkte = 0
  214. # Berechnung der Notenverteilung
  215. def Notenspiegel():
  216. global Notenverteilung
  217. global Studenten
  218. for i in range(41):
  219. Notenverteilung.append(0)
  220. for j in range(len(Studenten)):
  221. Vergleich = Studenten[j][2]
  222. Notenverteilung[int(10*(Vergleich-1))] += 1
  223. # Ausgabe des Notenspiegels
  224. def NotenspiegelAusgabe():
  225. global Notenverteilung
  226. root = Tk()
  227. root.title("Notenspiegel")
  228. for i in range(41):
  229. farbe = "#{:s}".format(str(999999-2390*i).zfill(6))
  230. tmp = 1.0 + float(i)/10.0
  231. Label(root, text = tmp).grid(row = i, column = 0)
  232. Label(root, width = int(float(Notenverteilung[i])/float(len(Studenten))*128), background = farbe).grid(row = i, column = 1, sticky = W, pady = 4)
  233. Button(root, text = "Beenden", command = root.destroy).grid(row = 0, column = 2)
  234. root.mainloop()
  235. Notenverteilung = []
  236. # Daten an das gewaehlte Speicherformat anpassen, sodass es spaeter nicht zu
  237. # Problemen beim wiederholten Bearbeiten, durch zu lange Namen kommt
  238. def DatenAnpassen():
  239. for i in range(len(Studenten)):
  240. if Studenten[i][0] >= 10**15:
  241. Studenten[i][0] = Studenten[i][0] - (Studenten[i][0] / 10**15) * 10**15
  242. if len(Studenten[i][1]) >= 16:
  243. Studenten[i][1] = Studenten[i][1][0:15]
  244. # Die Daten im Tabellenformat:
  245. # | Matr.Nr. | Name | Note |
  246. # abspeichern
  247. def TextdateiErstellen():
  248. global Studenten
  249. global StudentenPunkte
  250. Datei = open(name, "w")
  251. Datei.write("Name der Klausur:\t%s\n" % (name))
  252. Datei.write("Datum der Klausur:\t%s\n" % (date))
  253. Datei.write("|\tMatr.-Nr.\t|\t\tName\t\t|\tNote\t|\n\n")
  254. for i in range(len(Studenten)):
  255. Datei.write("|\t%8d\t|\t%16s\t|\t%4.1f\t|\n" % (Studenten[i][0], Studenten[i][1], Studenten[i][2]))
  256. Datei.close()
  257. Studenten = []
  258. StudentenPunkte = []
  259. # ueberprueft ob die Datei im aktuellen Ordner vorhanden ist
  260. def ExistenzPruefung():
  261. global name
  262. foldercontent = os.listdir(".")
  263. if name in foldercontent:
  264. return True
  265. else:
  266. return False
  267. # liest eine existierende Klausurendatei fuer die weitere Verarbeitung aus
  268. def DatenAuslesen():
  269. Datei = open(name,"r")
  270. Datei.readline()
  271. Datei.readline()
  272. Datei.readline()
  273. Datei.readline()
  274. while True:
  275. line = Datei.readline()
  276. if not line: break
  277. tmp = line.split("|")
  278. tmp = "".join(tmp)
  279. tmp = tmp.split("\t")
  280. tmp = "".join(tmp)
  281. tmp = tmp.split()
  282. Student = []
  283. Student.append(int(tmp[0]))
  284. Student.append(tmp[1])
  285. Student.append(float(tmp[2]))
  286. Studenten.append(Student)
  287. Datei.close()
  288. # Warnhinweis ausgeben
  289. def NichtExistenzVerkuenden():
  290. root = Tk()
  291. root.title("Keine Datei gefunden")
  292. Label(root, text = "Die Datei existiert noch gar nicht!").grid()
  293. Button(root, text = "Weiter", command = root.destroy).grid()
  294. root.mainloop()
  295. # Warnhinweis ausgeben
  296. def BereitsVorhandenseinVerkuenden():
  297. root = Tk()
  298. root.title("Datei existiert bereits")
  299. Label(root, text = "Die Datei existiert bereits!").grid()
  300. Button(root, text = "Weiter", command = root.destroy).grid()
  301. root.mainloop()
  302. # manuelle Aenderungen an existierender Klausurendatei vornehmen
  303. def Aenderungen():
  304. def WerteUebernehmen():
  305. for i in range(len(Studenten)):
  306. if float(entries[i].get()) <= 5 and 1.0 <= float(entries[i].get()):
  307. Studenten[i][2] = float(entries[i].get())
  308. root.destroy()
  309. root = Tk()
  310. root.title("Studentendaten aendern")
  311. entries = []
  312. for i in range(len(Studenten)):
  313. Label(root, text = Studenten[i][0]).grid(row = i, column = 0)
  314. Label(root, text = Studenten[i][1]).grid(row = i, column = 1)
  315. entries.append(Entry(root))
  316. entries[i].grid(row = i, column = 2)
  317. entries[i].insert(10,Studenten[i][2])
  318. Button(root, text = "Uebernehmen", command = WerteUebernehmen).grid(row = 0, column = 3)
  319. root.mainloop()
  320. # Hauptmenue aufrufen
  321. def Hauptmenue():
  322. def NeueKlausur():
  323. mainroot.destroy()
  324. SchluesselDatenAbfragen()
  325. if not ExistenzPruefung():
  326. AufgabenPunkteAbfragen()
  327. MindestPunktzahlAbfragen()
  328. BewertungsSpiegelBerechnen()
  329. StudentenMaskeGenerieren()
  330. GesamtNoteBerechnen()
  331. Notenspiegel()
  332. NotenspiegelAusgabe()
  333. DatenAnpassen()
  334. TextdateiErstellen()
  335. else:
  336. BereitsVorhandenseinVerkuenden()
  337. Hauptmenue()
  338. def AlteKlausurErweitern():
  339. mainroot.destroy()
  340. SchluesselDatenAbfragen()
  341. if ExistenzPruefung():
  342. AufgabenPunkteAbfragen()
  343. MindestPunktzahlAbfragen()
  344. BewertungsSpiegelBerechnen()
  345. StudentenMaskeGenerieren()
  346. GesamtNoteBerechnen()
  347. DatenAuslesen()
  348. Notenspiegel()
  349. NotenspiegelAusgabe()
  350. DatenAnpassen()
  351. TextdateiErstellen()
  352. else:
  353. NichtExistenzVerkuenden()
  354. Hauptmenue()
  355. def AlteKlausurBearbeiten():
  356. mainroot.destroy()
  357. SchluesselDatenAbfragen()
  358. if ExistenzPruefung():
  359. DatenAuslesen()
  360. Aenderungen()
  361. DatenAnpassen()
  362. Notenspiegel()
  363. NotenspiegelAusgabe()
  364. TextdateiErstellen()
  365. else:
  366. NichtExistenzVerkuenden()
  367. Hauptmenue()
  368. mainroot = Tk()
  369. mainroot.title("Hauptmenue")
  370. button1 = Button(mainroot, text = "Neue Klausur", command = NeueKlausur)
  371. button2 = Button(mainroot, text = "Alte Klausur erweitern", command = AlteKlausurErweitern)
  372. button3 = Button(mainroot, text = "Alte Klausur bearbeiten", command = AlteKlausurBearbeiten)
  373. button4 = Button(mainroot, text = "Beenden", command = mainroot.destroy)
  374. button1.grid(row = 0, column = 0)
  375. button2.grid(row = 0, column = 1)
  376. button3.grid(row = 0, column = 2)
  377. button4.grid(row = 0, column = 3)
  378. mainroot.mainloop()
  379. # Hauptprogramm
  380. Hauptmenue()