Automatisierte Notenvergabe bei Klausuren

ToolV00.py 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  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. def SchluesselDatenAbfragen():
  21. def WerteUebernehmen():
  22. global name
  23. global date
  24. name = entry1.get()
  25. date = entry2.get()
  26. root.destroy()
  27. # button1.config(text = "Weiter", command = 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. def AufgabenPunkteAbfragen():
  54. def VerbergeHilfe():
  55. button1.config(text = "Hilfe", fg = "green", command = ZeigeHilfe)
  56. def ZeigeHilfe():
  57. button1.config(text = "Anzahl Punkte fuer jede Aufgabe eintragen", command = VerbergeHilfe)
  58. def NaechsteAufgabeEinlesen():
  59. global zaehler
  60. zaehler += 1
  61. tmp = "Aufgabe",str(zaehler)
  62. label1.config(text = tmp, font = "Arial 10")
  63. entry1.delete(0,END)
  64. entry1.insert(10,"10")
  65. button1.config(text = "Hilfe", fg = "green", command = ZeigeHilfe)
  66. button2.config(text = "Weiter", command = EndeAbfragen)
  67. def EndeAbfragen():
  68. global PunkteProAufgabe
  69. PunkteProAufgabe.append(float(entry1.get()))
  70. label1.config(text = "Waren das alle Aufgaben?", font = "Arial 13 bold")
  71. button1.config(text = "Ja", fg = "black", command = root.destroy)
  72. button2.config(text = "Nein", command = NaechsteAufgabeEinlesen)
  73. root = Tk()
  74. tmp = "Aufgabe",str(zaehler)
  75. root.title("Punkte fuer einzelne Aufgaben")
  76. label1 = Label(root, text = tmp)
  77. Label(root, text = "Erreichbare Punkte").grid(row = 1, column = 0)
  78. label1.grid(row = 0, column = 1)
  79. entry1 = Entry(root)
  80. entry1.grid(row = 1, column = 1, pady = 4)
  81. entry1.insert(10,"10")
  82. button1 = Button(root, text = "Hilfe", fg = "green", command = ZeigeHilfe)
  83. button2 = Button(root, text = "Weiter", command = EndeAbfragen)
  84. button1.grid(row = 3, column = 0)
  85. button2.grid(row = 3, column = 1)
  86. root.mainloop()
  87. def MindestPunktzahlAbfragen():
  88. def WertUebernehmen():
  89. global ProzentSatz
  90. ProzentSatz = float(entry1.get())
  91. root.destroy()
  92. # button1.config(text = "Weiter", command = root.destroy)
  93. root = Tk()
  94. root.title("Prozentsatz zum Bestehen")
  95. Label(root, text = "Prozentsatz").grid(row = 0, column = 0)
  96. entry1 = Entry(root)
  97. entry1.grid(row = 0, column = 1)
  98. entry1.insert(10,"50")
  99. button1 = Button(root, text = "Uebernehmen", command = WertUebernehmen)
  100. button1.grid(row = 1, column = 1)
  101. root.mainloop()
  102. def BewertungsSpiegelBerechnen():
  103. global PunkteProAufgabe
  104. global ProzentSatz
  105. global Summe
  106. global BestehPunkte
  107. global minEins
  108. global minZwei
  109. global minDrei
  110. for i in range(len(PunkteProAufgabe)):
  111. Summe += PunkteProAufgabe[i]
  112. BestehPunkte = Summe * ProzentSatz/100
  113. tmp = Summe - BestehPunkte
  114. tmp /= 4
  115. minEins = Summe - tmp
  116. minZwei = minEins - tmp
  117. minDrei = minZwei - tmp
  118. def StudentenMaskeGenerieren():
  119. def VerbergeHilfe():
  120. button1.config(text = "Hilfe", fg = "green", command = ZeigeHilfe)
  121. def ZeigeHilfe():
  122. button1.config(text = "Beachte: _ anstatt Leerzeichen", command = VerbergeHilfe)
  123. def NaechstenStudentEinlesen():
  124. label1.config(text = "Name", font = "Arial 10")
  125. label2.config(text = "Matrikelnummer", font = "Arial 10")
  126. entry1.delete(0,END)
  127. entry2.delete(0,END)
  128. entry1.insert(10,"Max_Mustermann")
  129. entry2.insert(10,"9999999")
  130. for i in range(zaehler):
  131. entries[i].delete(0,END)
  132. entries[i].insert(10,PunkteProAufgabe[i])
  133. button1.config(text = "Hilfe", fg = "green", command = ZeigeHilfe)
  134. button2.config(text = "Uebernehmen", command = UebernehmeStudent)
  135. def UebernehmeStudent():
  136. global Studenten
  137. global StudentenPunkte
  138. tmpStudentenDaten = []
  139. tmpPunkte = []
  140. tmpStudentenDaten.append(int(entry2.get()))
  141. tmpStudentenDaten.append(entry1.get())
  142. Studenten.append(tmpStudentenDaten)
  143. tmpPunkte.append(int(entry2.get()))
  144. for i in range(zaehler):
  145. tmpPunkte.append(float(entries[i].get()))
  146. StudentenPunkte.append(tmpPunkte)
  147. label1.config(text = "Waren das alle", font = "Arial 12 bold")
  148. label2.config(text = "Studenten?", font = "Arial 12 bold")
  149. button1.config(text = "Ja", fg = "black", command = root.destroy)
  150. button2.config(text = "Nein", command = NaechstenStudentEinlesen)
  151. global PunkteProAufgabe
  152. root = Tk()
  153. root.title("Studentendaten")
  154. label1 = Label(root, text = "Name", font = "Arial 10")
  155. label2 = Label(root, text = "Matrikelnummer", font = "Arial 10")
  156. label1.grid(row = 0, column = 0)
  157. label2.grid(row = 1, column = 0)
  158. Label(root, text = "Aufgabe").grid(row = 2, column = 0)
  159. Label(root, text = "Erreichte Punkte").grid(row = 2, column = 1)
  160. entry1 = Entry(root)
  161. entry2 = Entry(root)
  162. entry1.grid(row = 0, column = 1, pady = 4)
  163. entry2.grid(row = 1, column = 1, pady = 4)
  164. entry1.insert(10,"Max_Mustermann")
  165. entry2.insert(10,"9999999")
  166. entries = []
  167. for i in range(zaehler):
  168. tmp = str(i+1)
  169. Label(root, text = tmp).grid(row = 3+i, column = 0)
  170. entries.append(Entry(root))
  171. entries[i].grid(row = 3+i, column = 1, pady = 4)
  172. entries[i].insert(10,PunkteProAufgabe[i])
  173. button1 = Button(root, text = "Hilfe", fg = "green", command = ZeigeHilfe)
  174. button2 = Button(root, text = "Uebernehmen", command = UebernehmeStudent)
  175. button1.grid(row = 0, column = 2)
  176. button2.grid(row = 1, column = 2)
  177. root.mainloop()
  178. def GesamtNoteBerechnen():
  179. global Studenten
  180. global StudentenPunkte
  181. global minEins
  182. global minZwei
  183. global minDrei
  184. global BestehPunkte
  185. for i in range(len(Studenten)):
  186. tmpSumme = 0
  187. for j in range(1,len(StudentenPunkte[i])):
  188. tmpSumme += StudentenPunkte[i][j]
  189. if tmpSumme < BestehPunkte:
  190. Studenten[i].append(5.0)
  191. elif tmpSumme < minDrei:
  192. Studenten[i].append(4.0 + 1 - float(int(10 * ((tmpSumme - BestehPunkte) / (minDrei - BestehPunkte)))) / 10.0)
  193. elif tmpSumme < minZwei:
  194. Studenten[i].append(3.0 + 1 - float(int(10 * ((tmpSumme - minDrei) / (minZwei - minDrei)))) / 10.0)
  195. elif tmpSumme < minEins:
  196. Studenten[i].append(2.0 + 1 - float(int(10 * ((tmpSumme - minZwei) / (minEins - minZwei)))) / 10.0)
  197. else:
  198. Studenten[i].append(1.0 + 1 - float(int(10 * ((tmpSumme - minEins) / (Summe - minEins)))) / 10.0)
  199. def Notenspiegel():
  200. global Notenverteilung
  201. global Studenten
  202. for i in range(41):
  203. Notenverteilung.append(0)
  204. for j in range(len(Studenten)):
  205. Vergleich = Studenten[j][2]
  206. Notenverteilung[int(10*(Vergleich-1))] += 1
  207. def NotenspiegelAusgabe():
  208. Farbauswahl = ["red", "black"]
  209. Farbe = 0
  210. root = Tk()
  211. root.title("Notenspiegel")
  212. for i in range(41):
  213. if Farbe < 1:
  214. Farbe += 1
  215. else:
  216. Farbe = 0
  217. tmp = 1.0 + float(i)/10.0
  218. Label(root, text = tmp).grid(row = i, column = 0)
  219. Label(root, width = int(float(Notenverteilung[i])/float(len(Studenten))*128), background = Farbauswahl[Farbe]).grid(row = i, column = 1, sticky = W, pady = 4)
  220. Button(root, text = "Beenden", command = root.destroy).grid(row = 0, column = 2)
  221. root.mainloop()
  222. def DatenAnpassen():
  223. for i in range(len(Studenten)):
  224. if Studenten[i][0] >= 10**15:
  225. Studenten[i][0] = Studenten[i][0] - (Studenten[i][0] / 10**15) * 10**15
  226. if len(Studenten[i][1]) >= 16:
  227. Studenten[i][1] = Studenten[i][1][0:15]
  228. def TextdateiErstellen():
  229. Datei = open(name, "w")
  230. Datei.write("Name der Klausur:\t%s\n" % (name))
  231. Datei.write("Datum der Klausur:\t%s\n" % (date))
  232. Datei.write("|\tMatr.-Nr.\t|\t\tName\t\t|\tNote\t|\n\n")
  233. for i in range(len(Studenten)):
  234. Datei.write("|\t%8d\t|\t%16s\t|\t%4.1f\t|\n" % (Studenten[i][0], Studenten[i][1], Studenten[i][2]))
  235. Datei.close()
  236. def ExistenzPruefung():
  237. global name
  238. foldercontent = os.listdir(".")
  239. if name in foldercontent:
  240. return True
  241. else:
  242. return False
  243. def DatenAuslesen():
  244. Datei = open(name,"r")
  245. Datei.readline()
  246. Datei.readline()
  247. Datei.readline()
  248. Datei.readline()
  249. while True:
  250. line = Datei.readline()
  251. if not line: break
  252. tmp = line.split("|")
  253. tmp = "".join(tmp)
  254. tmp = tmp.split("\t")
  255. tmp = "".join(tmp)
  256. tmp = tmp.split()
  257. Student = []
  258. Student.append(int(tmp[0]))
  259. Student.append(tmp[1])
  260. Student.append(float(tmp[2]))
  261. Studenten.append(Student)
  262. Datei.close()
  263. def NichtExistenzVerkuenden():
  264. root = Tk()
  265. root.title("Keine Datei gefunden")
  266. Label(root, text = "Die Datei existiert noch gar nicht!").grid()
  267. Button(root, text = "Weiter", command = root.destroy).grid()
  268. root.mainloop()
  269. def Hauptmenue():
  270. def NeueKlausur():
  271. mainroot.destroy()
  272. SchluesselDatenAbfragen()
  273. AufgabenPunkteAbfragen()
  274. MindestPunktzahlAbfragen()
  275. BewertungsSpiegelBerechnen()
  276. StudentenMaskeGenerieren()
  277. GesamtNoteBerechnen()
  278. Notenspiegel()
  279. NotenspiegelAusgabe()
  280. DatenAnpassen()
  281. TextdateiErstellen()
  282. Hauptmenue()
  283. def AlteKlausur():
  284. mainroot.destroy()
  285. SchluesselDatenAbfragen()
  286. if ExistenzPruefung():
  287. AufgabenPunkteAbfragen()
  288. MindestPunktzahlAbfragen()
  289. BewertungsSpiegelBerechnen()
  290. StudentenMaskeGenerieren()
  291. GesamtNoteBerechnen()
  292. DatenAuslesen()
  293. Notenspiegel()
  294. NotenspiegelAusgabe()
  295. DatenAnpassen()
  296. TextdateiErstellen()
  297. else:
  298. NichtExistenzVerkuenden()
  299. Hauptmenue()
  300. mainroot = Tk()
  301. mainroot.title("Hauptmenue")
  302. button1 = Button(mainroot, text = "Neue Klausur", command = NeueKlausur)
  303. button2 = Button(mainroot, text = "Alte Klausur erweitern", command = AlteKlausur)
  304. button3 = Button(mainroot, text = "Beenden", command = mainroot.destroy)
  305. button1.grid(row = 1, column = 0)
  306. button2.grid(row = 2, column = 0)
  307. button3.grid(row = 3, column = 0)
  308. mainroot.mainloop()
  309. # Hauptprogramm
  310. Hauptmenue()