Datenablage für Tinnitus Therapie Projektarbeit von Julian Seyffer und Heiko Ommert SS2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TinnitusAnalyse_GUI.py 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. from tkinter.ttk import Frame, Label, Button, LabelFrame, Combobox, Style, Checkbutton, Entry, Panedwindow, Separator
  2. from tkinter import *
  3. from SoundGenerator import *
  4. import csv
  5. import time
  6. """--------------------------FUNKTIONEN DIE DURCH GUI KLICKS AUSGEFÜHRT WERDEN---------------------------------------"""
  7. """-------Funktionen links-------------"""
  8. def links_scale_lautstärke_change(self):
  9. tinnitus.linksLautstaerke = float(linksScaleLautstärke.get())/100 # scale liefert 0-100%, tinnitus.lautstärke 0-1
  10. print("Links Lautstärke =", tinnitus.linksLautstaerke*100, "%")
  11. sound.play()
  12. def links_scale_frequenz_change(self):
  13. tinnitus.linksFrequenz = float(linksScaleFrequenz.get())*1000 # scale liefert 20-20kHz, tinnitus.frequenz in Hz
  14. print("Links Frequenz = ", tinnitus.linksFrequenz, " Hz")
  15. sound.play()
  16. def links_scale_rauschen_lautstärke_change(self):
  17. tinnitus.linksRauschenLautstaerke = float(linksScaleRauschenLautstärke.get()/1000)
  18. print("Links Rauschen Lautstärke = ", tinnitus.linksRauschenLautstaerke*1000, "%")
  19. sound.play()
  20. def links_scale_rauschen_mittelfrequenz_change(self):
  21. linksRauschenMittelfrequenz = float(linksScaleRauschenMittelFrequenz.get())
  22. print("Links Rauschen Mittelfrequenz = ", linksRauschenMittelfrequenz)
  23. sound.play()
  24. def links_scale_rauschen_bandbreite_change(self):
  25. linksRauschenBandbreite = float(linksScaleRauschenBandbreite.get())
  26. print("Links Rauschen Bandbreite = ", linksRauschenBandbreite)
  27. sound.play()
  28. """----------Funktionen rechts----------"""
  29. def rechts_scale_lautstärke_change(self):
  30. tinnitus.rechtsLautstaerke = float(rechtsScaleLautstärke.get()/100)
  31. print("Rechts Lautstärke =", tinnitus.rechtsLautstaerke, "%")
  32. sound.play()
  33. def rechts_scale_frequenz_change(self):
  34. tinnitus.rechtsFrequenz = float(rechtsScaleFrequenz.get()*1000)
  35. print("Rechts Frequenz= ", tinnitus.rechtsFrequenz, " Hz")
  36. sound.play()
  37. def rechts_scale_rauschen_lautstärke_change(self):
  38. tinnitus.rechtsRauschenLautstaerke = float(rechtsScaleRauschenLautstärke.get()/1000)
  39. print("Rechts Rauschen Lautstärke = ", tinnitus.rechtsRauschenLautstaerke*1000, "%")
  40. sound.play()
  41. def rechts_scale_rauschen_mittelfrequenz_change(self):
  42. rechtsRauschenMittelfrequenz = float(rechtsScaleRauschenMittelFrequenz.get())
  43. print("Rechts Rauschen Mittelfrequenz = ", rechtsRauschenMittelfrequenz)
  44. sound.play()
  45. def rechts_scale_rauschen_bandbreite_change(self):
  46. rechtsRauschenBandbreite = float(rechtsScaleRauschenBandbreite.get())
  47. print("Rechts Rauschen Bandbreite = ", rechtsRauschenBandbreite)
  48. sound.play()
  49. """--------------Funktionen unten------------------"""
  50. def unten_button_ohren_synchro():
  51. auswahl = untenComboOhrenSynchro.get() # holt die momentane Auswahl aus combobox
  52. print("Einstellungen von:" + auswahl + " das auf das jeweils andere Ohr setzen")
  53. if auswahl == "Linkes Ohr": # linkes --> rechts
  54. rechtsScaleLautstärke.set(linksScaleLautstärke.get())
  55. rechtsScaleFrequenz.set(linksScaleFrequenz.get())
  56. rechtsScaleRauschenLautstärke.set(linksScaleRauschenLautstärke.get())
  57. rechtsScaleRauschenMittelFrequenz.set(linksScaleRauschenMittelFrequenz.get())
  58. rechtsScaleRauschenBandbreite.set(linksScaleRauschenBandbreite.get())
  59. feedback("Einstellungen vom linken Ohr auf beide Ohren übertragen", "white", "blue")
  60. if auswahl == "Rechtes Ohr": # rechts --> links
  61. linksScaleLautstärke.set(rechtsScaleLautstärke.get())
  62. linksScaleFrequenz.set(rechtsScaleFrequenz.get())
  63. linksScaleRauschenLautstärke.set(rechtsScaleRauschenLautstärke.get())
  64. linksScaleRauschenMittelFrequenz.set(rechtsScaleRauschenMittelFrequenz.get())
  65. linksScaleRauschenBandbreite.set(rechtsScaleRauschenBandbreite.get())
  66. feedback("Einstellungen vom rechten Ohr auf beide Ohren übertragen", "white", "blue")
  67. def unten_button_speichern_press():
  68. print("button speichern pressed")
  69. # Wenn man Speichern will bevor ein Name eingegeben wurde kann man nicht speichern
  70. if (not untenEntryVorname.get()) or (not untenEntryNachname.get()) or \
  71. (untenEntryNachname == "Erst Namen..") or (untenEntryVorname == "..eintragen bitte"):
  72. nachname.set("Erst Namen..")
  73. vorname.set("..eintragen bitte")
  74. print("fehlgeschlagener Speicherversuch - Keine Eingaben gemacht")
  75. feedback("Fehlgeschlagener Speicherversuch! Mögliche Gründe: Erst Namen links eintragen.", "yellow", "red")
  76. feedback("Falls es danach immer noch nicht geht, bitte Microsoft Excel schließen.", "yellow", "red")
  77. else:
  78. try:
  79. feedback("Speichere Sound als .wav Datei . Kann bis zu 30 Sekunden dauern. Bitte warten...", "white", "blue")
  80. # todo: warum auch immer, aber irgendwie wird feedback nach wav_speichern ausgeführt
  81. tinnitus.vorname = untenEntryVorname.get()
  82. tinnitus.nachname = untenEntryNachname.get()
  83. tinnitus.kommentar = untenTextKommentar.get("1.0", END)
  84. tinnitus.speichern()
  85. sound.wav_speichern()
  86. feedback("Daten erfolgreich gespeichert. Siehe: 'MeinTinnitus.wav' ", "white", "blue")
  87. except:
  88. feedback("Fehlgeschlagener Speicherversuch! Mögliche Gründe: Erst Namen links eintragen.", "yellow", "red")
  89. feedback("Falls es danach immer noch nicht geht, bitte Microsoft Excel schließen.", "yellow", "red")
  90. def unten_button_play_press():
  91. print("button play pressed")
  92. feedback("Starte Audioausgabe...", "white", "green")
  93. sound.mute = False # when this boolean is set to false no audio can ever play (it`s like a savety switch)
  94. sound.play()
  95. def unten_button_stop_press():
  96. print("button stop press")
  97. feedback("Stoppe Audioausgabe", "white", "red") # place text in feedback field, fontcololor, backgroundcolor
  98. sound.mute = True
  99. sound.stop()
  100. def feedback(text, fontcolor, backgroundcolor):
  101. """ This is a helper function. You can give it a string text and it will display it in the feedback frame (bottom
  102. right of the GUI) in the text widget. The parameter color is also a string and defines the font color. Same with
  103. background. Honestly this function is way too complicated, but Tkinter has no nicer/easier builtin way of doing the
  104. coloring nicely """
  105. feedback.lineCounter += 1 # in order to color the texts nicely we need to count the lines of text we add
  106. untenFeedbackText.config(state=NORMAL) # activate text field (otherwise it is readonly)
  107. if feedback.lineCounter == 12: # if we reached the end of the text box
  108. untenFeedbackText.delete("1.0", END) # just delete everything
  109. feedback.lineCounter = 1 # and start at line 1 again
  110. untenFeedbackText.insert(INSERT, text + "\n") # insert the text
  111. # these 2 lines just color the text nicely, but Tkinter forces your to first "tag_add" mark it and specify the
  112. # line number and char number you want to mark. And then "tag_config" change the color of this marked region
  113. untenFeedbackText.tag_add("Line"+str(feedback.lineCounter), str(feedback.lineCounter)+".0", str(float(len(text))))
  114. untenFeedbackText.tag_config("Line"+str(feedback.lineCounter), foreground=fontcolor, background=backgroundcolor)
  115. untenFeedbackText.config(state=DISABLED) # set the text field back to readonly
  116. """ Initialisierungen """
  117. tinnitus = Tinnitus() # siehe SoundGenerator.py
  118. sound = Sound(tinnitus) # siehe SoundGenerator.py
  119. feedback.lineCounter = 0 # Funktionsvariable der Feedback funktion. Ein Funktionsaufruf Counter
  120. """------------------------------------------ AUFBAU DES ROOT WINDOWS -----------------------------------------------"""
  121. root = Tk() # build the main window
  122. root.title("Tinnitus Analyse")
  123. root.minsize(width=800, height=500) # set windowsize (width an height in pixels)
  124. root.resizable(False, False) # window not resizable (x and y)
  125. """------------------------------------------LINKER FRAME------------------------------------------------------------"""
  126. linkerFrame = LabelFrame(root, text="Linkes Ohr", font="bold") # parent is root, padding is extra space at the edges
  127. linkerFrame.grid(column=0, row=0, sticky=(N+W+E+S)) # the frame sticks to every side of the window when resized
  128. linksLautstärke = DoubleVar()
  129. linksFrequenz = DoubleVar()
  130. linksRauschenLautstärke = DoubleVar()
  131. linksRauschenFrequenzband = DoubleVar()
  132. # ------------------ LAUTSTÄRKE ------------------
  133. linksLabelLautstärke = Label(linkerFrame, text="Lautstärke [%]:")
  134. linksLabelLautstärke.grid(column=0, row=0, sticky=W)
  135. linksScaleLautstärke = Scale(linkerFrame, from_=0, to=100, orient=HORIZONTAL, length=600,
  136. command=links_scale_lautstärke_change)
  137. linksScaleLautstärke.grid(column=1, row=0, sticky=N+S+W+E)
  138. # -------- FREQUENZ ------------------------
  139. linksLabelFrequenz = Label(linkerFrame, text="Frequenz [kHz]")
  140. linksLabelFrequenz.grid(column=0, row=1, sticky=W) # sticky = w(est) makes the text left aligned
  141. linksScaleFrequenz = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  142. command=links_scale_frequenz_change)
  143. linksScaleFrequenz.grid(column=1, row=1, sticky=(W+E))
  144. # ----------- ABTRENNSTRICH ----------------
  145. linksSeparator = Separator(linkerFrame, orient="horizontal")
  146. linksSeparator.grid(column=0, row=2, sticky=(W + E), columnspan=3)
  147. # ----------- RAUSCHEN --------------------
  148. linksLabelRauschenLautstärke = Label(linkerFrame, text="Rauschen Lautstärke %", anchor="w")
  149. linksLabelRauschenLautstärke.grid(column=0, row=3, sticky=W)
  150. linksScaleRauschenLautstärke = Scale(linkerFrame, from_=0, to=100, orient=HORIZONTAL, length=600,
  151. command=links_scale_rauschen_lautstärke_change)
  152. linksScaleRauschenLautstärke.grid(column=1, row=3, sticky=(W+E))
  153. linksLabelRauschenMittelFrequenz = Label(linkerFrame, text="Rauschen Mittelfrequenz [kHz]", anchor="w")
  154. linksLabelRauschenMittelFrequenz .grid(column=0, row=4, sticky=(W+E))
  155. linksScaleRauschenMittelFrequenz = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  156. command=links_scale_rauschen_mittelfrequenz_change)
  157. linksScaleRauschenMittelFrequenz.grid(column=1, row=4, sticky=(W+E))
  158. linksLabelRauschenBandbreite= Label(linkerFrame, text="Rauschen Bandbreite [kHz]", anchor="w")
  159. linksLabelRauschenBandbreite.grid(column=0, row=5, sticky=W)
  160. linksScaleRauschenBandbreite = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  161. command=links_scale_rauschen_bandbreite_change)
  162. linksScaleRauschenBandbreite.grid(column=1, row=5, sticky=(W+E))
  163. """----------------------------------------------RECHTER FRAME-------------------------------------------------------"""
  164. rechterFrame = LabelFrame(root, text="Rechtes Ohr", font="bold")
  165. rechterFrame.grid(column=1, row=0, sticky=(N+E+W+S))
  166. # Variablen Rechts
  167. rechtsFrequenz = DoubleVar()
  168. rechtsRauschenLautstärke = DoubleVar()
  169. rechtsRauschenFrequenzband = DoubleVar()
  170. rechtsLautstärke = DoubleVar()
  171. # ------------------ LAUTSTÄRKE ------------------
  172. rechtsLabelLautstärke = Label(rechterFrame, text="Lautstärke [%]:")
  173. rechtsLabelLautstärke.grid(column=0, row=0, sticky=W)
  174. rechtsScaleLautstärke = Scale(rechterFrame, from_=0, to=100, orient=HORIZONTAL, length=600,
  175. command=rechts_scale_lautstärke_change)
  176. rechtsScaleLautstärke.grid(column=1, row=0, columnspan=10, sticky=W)
  177. # -------- FREQUENZ ------------------------
  178. rechtsLabelFrequenz = Label(rechterFrame, text="Frequenz [kHz]")
  179. rechtsLabelFrequenz.grid(column=0, row=1, sticky=W) # sticky = w(est) makes the text left aligned
  180. rechtsScaleFrequenz = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  181. command=rechts_scale_frequenz_change)
  182. rechtsScaleFrequenz.grid(column=1, row=1, columnspan=10, sticky=(W+E))
  183. # ----------- ABTRENNSTRICH ----------------
  184. rechtsSeparator = Separator(rechterFrame, orient="horizontal")
  185. rechtsSeparator.grid(column=0, row=2, columnspan=10, sticky=(W + E))
  186. # ----------- RAUSCHEN --------------------
  187. rechtsLabelRauschenLautstärke = Label(rechterFrame, text="Rauschen Lautstärke %", anchor="w")
  188. rechtsLabelRauschenLautstärke.grid(column=0, row=3, sticky=W)
  189. rechtsScaleRauschenLautstärke = Scale(rechterFrame, from_=0, to=100, orient=HORIZONTAL, length=600,
  190. command=rechts_scale_rauschen_lautstärke_change)
  191. rechtsScaleRauschenLautstärke.grid(column=1, row=3, sticky=(W+E))
  192. rechtsLabelRauschenMittelFrequenz = Label(rechterFrame, text="Rauschen Mittelfrequenz [kHz]", anchor="w")
  193. rechtsLabelRauschenMittelFrequenz .grid(column=0, row=4)
  194. rechtsScaleRauschenMittelFrequenz = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  195. command=rechts_scale_rauschen_mittelfrequenz_change)
  196. rechtsScaleRauschenMittelFrequenz.grid(column=1, row=4)
  197. rechtsLabelRauschenBandbreite = Label(rechterFrame, text="Rauschen Bandbreite [kHz]", anchor="w")
  198. rechtsLabelRauschenBandbreite.grid(column=0, row=5, sticky=W)
  199. rechtsScaleRauschenBandbreite = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  200. command=rechts_scale_rauschen_bandbreite_change)
  201. rechtsScaleRauschenBandbreite.grid(column=1, row=5, sticky=(W+E))
  202. """------------------------------------------------ UNTERER LINKER FRAME---------------------------------------------"""
  203. untererFrame = LabelFrame(root, text="Generelles", border=10)
  204. untererFrame.grid(column=0, row=1, sticky=(N + W + S + E))
  205. vorname = StringVar() # Name des Patienten als String um den generierten Tinnitus später zuordnen zu können
  206. nachname = StringVar()
  207. kommentare = StringVar() # Ein Feld in dass der Patient noch weitere Kommentare angeben kann
  208. # Den unteren Frame füllen----------------------------------------------------------------------------------------------
  209. # --------- OHREN SYNCHRONISIEREN -----------------------
  210. untenLabelOhrenSynchro = Label(untererFrame, text="Einstellungen von ")
  211. untenLabelOhrenSynchro.grid(column=0, row=0, sticky=(N + W))
  212. untenComboOhrenSynchro = Combobox(untererFrame, values=["Linkes Ohr", "Rechtes Ohr"])
  213. untenComboOhrenSynchro.grid(column=1, row=0, sticky=(N + W + E + S))
  214. untenLabelOhrenSynchro2 = Label(untererFrame, text=" für beide übernehmen")
  215. untenLabelOhrenSynchro2.grid(column=2, row=0, sticky=(N + W + E + S))
  216. untenButtonOhrenSynchro = Button(untererFrame, text="Bestätigen",
  217. command=unten_button_ohren_synchro)
  218. untenButtonOhrenSynchro.grid(column=3, row=0, sticky=(N + W + E + S))
  219. #----------- PLAY BUTTON
  220. untenButtonPlay = Button(untererFrame, text="PLAY", font="bold", relief="raised", bg="green", fg="white",
  221. command=unten_button_play_press)
  222. untenButtonPlay.grid(column=8, row=0, sticky=(N + W + E + S))
  223. #------------STOP BUTTON-------------
  224. untenButtonStop = Button(untererFrame, text="STOP", font="bold", relief="raised", bg="red", fg="white",
  225. command=unten_button_stop_press)
  226. untenButtonStop.grid(column=9, row=0, sticky=(N + W + E + S))
  227. # ----------- ABTRENNSTRICHE ----------------
  228. untenSeparator = Separator(untererFrame, orient="horizontal")
  229. untenSeparator.grid(column=0, row=1, columnspan=10, sticky=(W + E))
  230. untenSeperator2 = Separator(untererFrame, orient="vertical")
  231. untenSeperator2.grid(column=5, rowspan=5, sticky=N+S)
  232. # ------------NAMENSEINGABE-------------
  233. untenLabelNachname = Label(untererFrame, text="Nachname:")
  234. untenLabelNachname.grid(column=0, row=2, sticky=W)
  235. untenEntryNachname = Entry(untererFrame, textvariable=nachname)
  236. untenEntryNachname.grid(column=1, row=2, sticky=W)
  237. untenLabelVorname = Label(untererFrame, text="Vorname:")
  238. untenLabelVorname.grid(column=0, row=3, sticky=W)
  239. untenEntryVorname = Entry(untererFrame, textvariable=vorname)
  240. untenEntryVorname.grid(column=1, row=3, sticky=W)
  241. # ------------ KOMMENTAR ----------------
  242. untenLabelKommentar = Label(untererFrame, text="weitere Kommentare:")
  243. untenLabelKommentar.grid(column=0, row=4, sticky=W)
  244. untenTextKommentar = Text(untererFrame, height=10, width=50) # create a field where u can enter text
  245. untenTextKommentar.grid(column=1, row=4, columnspan=3, rowspan=3)
  246. # ----------- SPEICHERN --------------------
  247. untenButtonSpeichern = Button(untererFrame, text="Speichern", font="bold",
  248. command=unten_button_speichern_press)
  249. untenButtonSpeichern.grid(column=4, row=6, sticky=S)
  250. """--------------------------------------UNTERER RECHTER FRAME-------------------------------------------------------"""
  251. untererRechterFrame = LabelFrame(root, text="Programm Feedback")
  252. untererRechterFrame.grid(row=1, column=1, sticky=(N+S+E+W))
  253. # ------------ PROGRAMM OUTPUT ------------
  254. untenFeedbackText = Text(untererRechterFrame, height=13, width=85, bg="lightblue") # write feedback to patient here
  255. #untenFeedbackText.config(state=DISABLED) # make the text widget readonly
  256. untenFeedbackText.place(relx=.5, rely=.5, anchor="center") # the only time I used .place instead of grid, because it
  257. # lets me place the widget in the middle of the frame
  258. root.mainloop()