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 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. from tkinter import filedialog
  2. from tkinter.ttk import Frame, Label, Button, LabelFrame, Combobox, Style, Checkbutton, Entry, Panedwindow, Separator
  3. from tkinter import *
  4. from SoundGenerator import *
  5. import sounddevice as sd
  6. from scipy.io import wavfile
  7. import threading
  8. """--------------------------FUNKTIONEN DIE DURCH GUI KLICKS AUSGEFÜHRT WERDEN---------------------------------------"""
  9. """-------Funktionen links-------------"""
  10. def links_scale_lautstärke_change(self):
  11. tinnitus.linksLautstaerke = float(linksScaleLautstärke.get())/100 # scale liefert 0-100%, tinnitus.lautstärke 0-1
  12. print("Links Lautstärke =", tinnitus.linksLautstaerke*100, "%")
  13. sound.play()
  14. def links_scale_frequenz_change(self):
  15. tinnitus.linksFrequenz = float(linksScaleFrequenz.get())*1000 # scale liefert 20-20kHz, tinnitus.frequenz in Hz
  16. print("Links Frequenz = ", tinnitus.linksFrequenz, " Hz")
  17. sound.play()
  18. def links_scale_rauschen_lautstärke_change(self):
  19. # scale liefert 0-100%, tinnitus.lautstärke zwischen 0-1 (float)
  20. tinnitus.linksRauschenLautstaerke = float(linksScaleRauschenLautstärke.get()/1000)
  21. print("Links Rauschen Lautstärke = ", tinnitus.linksRauschenLautstaerke*1000, "%")
  22. sound.play()
  23. def links_scale_untere_grenzfrequenz_change(self):
  24. og = float(linksScaleObereGrenzfrequenz.get() * 1000) # kHz -> Hz
  25. ug = float(linksScaleUntereGrenzfrequenz.get() * 1000) # kHz -> Hz
  26. if og <= ug: # wenn obere Grenzfreq. kleiner als untere Grenzfreq. ist -> macht keinen Sinn deswegen verbieten
  27. linksScaleUntereGrenzfrequenz.set(linksScaleObereGrenzfrequenz.get() - 0.01)
  28. else:
  29. tinnitus.linksRauschenUntereGrenzfrequenz = ug
  30. sound.play()
  31. def links_scale_obere_grenzfrequenz_change(self):
  32. og = float(linksScaleObereGrenzfrequenz.get()*1000) # kHz -> Hz
  33. ug = float(linksScaleUntereGrenzfrequenz.get() * 1000) # kHz -> Hz
  34. if og <= ug: # wenn obere Grenzfreq. kleiner als untere Grenzfreq. ist -> macht keinen Sinn deswegen verbieten
  35. linksScaleObereGrenzfrequenz.set(linksScaleUntereGrenzfrequenz.get() + 0.01)
  36. else:
  37. tinnitus.linksRauschenObereGrenzfrequenz = og
  38. sound.play()
  39. """----------Funktionen rechts----------"""
  40. def rechts_scale_lautstärke_change(self):
  41. tinnitus.rechtsLautstaerke = float(rechtsScaleLautstärke.get()/100)
  42. print("Rechts Lautstärke =", tinnitus.rechtsLautstaerke, "%")
  43. sound.play()
  44. def rechts_scale_frequenz_change(self):
  45. tinnitus.rechtsFrequenz = float(rechtsScaleFrequenz.get()*1000)
  46. print("Rechts Frequenz= ", tinnitus.rechtsFrequenz, " Hz")
  47. sound.play()
  48. def rechts_scale_rauschen_lautstärke_change(self):
  49. tinnitus.rechtsRauschenLautstaerke = float(rechtsScaleRauschenLautstärke.get()/1000) # 0-100% -> 0-1(float)
  50. print("Rechts Rauschen Lautstärke = ", tinnitus.rechtsRauschenLautstaerke*1000, "%")
  51. sound.play()
  52. def rechts_scale_untere_grenzfrequenz_change(self):
  53. og = float(rechtsScaleObereGrenzfrequenz.get() * 1000) # kHz -> Hz
  54. ug = float(rechtsScaleUntereGrenzfrequenz.get() * 1000) # kHz -> Hz
  55. if ug >= og: # wenn obere Grenzfreq. kleiner als untere Grenzfreq. ist -> macht keinen Sinn deswegen verbieten
  56. rechtsScaleUntereGrenzfrequenz.set(rechtsScaleObereGrenzfrequenz.get()-0.01)
  57. else:
  58. tinnitus.rechtsRauschenUntereGrenzfrequenz = ug
  59. sound.play()
  60. def rechts_scale_obere_grenzfrequenz_change(self):
  61. og = float(rechtsScaleObereGrenzfrequenz.get()*1000) # kHz -> Hz
  62. ug = float(rechtsScaleUntereGrenzfrequenz.get() * 1000) # kHz -> Hz
  63. if og <= ug: # wenn obere Grenzfreq. kleiner als untere Grenzfreq. ist -> macht keinen Sinn deswegen verbieten
  64. rechtsScaleObereGrenzfrequenz.set(rechtsScaleUntereGrenzfrequenz.get()+0.01)
  65. else:
  66. tinnitus.rechtsRauschenObereGrenzfrequenz = og
  67. sound.play()
  68. """--------------Funktionen unten------------------"""
  69. def unten_button_ohren_synchro():
  70. auswahl = untenComboOhrenSynchro.get() # holt die momentane Auswahl aus combobox
  71. print("Einstellungen von:" + auswahl + " das auf das jeweils andere Ohr setzen")
  72. if auswahl == "":
  73. feedback("Bitte wähle ein Ohr", "white", "red")
  74. if auswahl == "Linkes Ohr": # linkes --> rechts
  75. rechtsScaleLautstärke.set(linksScaleLautstärke.get())
  76. rechtsScaleFrequenz.set(linksScaleFrequenz.get())
  77. rechtsScaleRauschenLautstärke.set(linksScaleRauschenLautstärke.get())
  78. rechtsScaleUntereGrenzfrequenz.set(linksScaleUntereGrenzfrequenz.get())
  79. rechtsScaleObereGrenzfrequenz.set(linksScaleObereGrenzfrequenz.get())
  80. feedback("Einstellungen vom linken Ohr auf beide Ohren übertragen")
  81. if auswahl == "Rechtes Ohr": # rechts --> links
  82. linksScaleLautstärke.set(rechtsScaleLautstärke.get())
  83. linksScaleFrequenz.set(rechtsScaleFrequenz.get())
  84. linksScaleRauschenLautstärke.set(rechtsScaleRauschenLautstärke.get())
  85. linksScaleUntereGrenzfrequenz.set(rechtsScaleUntereGrenzfrequenz.get())
  86. linksScaleObereGrenzfrequenz.set(rechtsScaleObereGrenzfrequenz.get())
  87. feedback("Einstellungen vom rechten Ohr auf beide Ohren übertragen")
  88. def unten_button_speichern_press():
  89. print("button speichern pressed")
  90. # Wenn man Speichern will bevor ein Name eingegeben wurde kann man nicht speichern
  91. if (not untenEntryVorname.get()) or (not untenEntryNachname.get()):
  92. print("fehlgeschlagener Speicherversuch - Keine Eingaben gemacht")
  93. feedback("Fehlgeschlagener Speicherversuch! Erst Namen links eintragen.", "white", "red")
  94. else:
  95. try:
  96. unten_button_stop_press() # Wiedergabe beenden, durch den Rechenaufwand gibt es sonst Wiedergabeprobleme
  97. tinnitus.vorname = untenEntryVorname.get()
  98. tinnitus.nachname = untenEntryNachname.get()
  99. tinnitus.kommentar = untenTextKommentar.get("1.0", END)
  100. tinnitus.speichern()
  101. feedback("Speichere Sound als '.wav'-Datei. Bitte warten...")
  102. sound.wav_speichern()
  103. feedback("Daten erfolgreich gespeichert. Siehe: " + sound.wav_name, "white", "green")
  104. except:
  105. feedback("Fehlgeschlagener Speicherversuch! Bitte schließe Microsoft Excel.", "white", "red")
  106. def unten_button_play_press():
  107. print("button play pressed")
  108. feedback("Starte Audioausgabe...", fontcolor="green")
  109. sound.mute = False # when this boolean is set to false no audio can ever play (it`s like a savety switch)
  110. sound.play()
  111. def unten_button_stop_press():
  112. print("button stop press")
  113. feedback("Stoppe Audioausgabe", fontcolor="red") # place text in feedback field, fontcololor, backgroundcolor
  114. sound.mute = True
  115. sound.stop()
  116. def unten_button_musikdatei_laden_press():
  117. """ This function opends a window that lets you select .mp3 and .wav files. The user is supposed to select their
  118. music files here"""
  119. print("button musikdatei laden pressed")
  120. untererFrame.musikdatei = filedialog.askopenfilename(initialdir="/",
  121. title="Wähle die Musikdatei(.wav) deiner Wahl aus",
  122. filetypes=(("wav Dateien", "*.wav"),))
  123. # überprüfen, ob song stereo ist
  124. try:
  125. wav_obj = wave.open(untererFrame.musikdatei)
  126. except:
  127. feedback("Der ausgewählte Song ist nicht kompatibel", "white", "red")
  128. return
  129. if wav_obj.getnchannels() != 2:
  130. feedback("Der ausgewählte Song ist mono. Bitte wähle einen Song in stereo", "white", "red")
  131. return
  132. samplerate, data = wavfile.read(untererFrame.musikdatei)
  133. sound.music_samplerate = samplerate # die samplerate der ausgewählten Musikdatei an SoundGenerator.py übergeben
  134. sound.music_data = data # das Numpy Array der ausgewählten Musikdatei an SoundGenerator.py übergeben
  135. print(untererFrame.musikdatei)
  136. untenTextMusikDatei.config(state=NORMAL) # activate text field (otherwise it is readonly)
  137. untenTextMusikDatei.delete(1.0, END) # delete everything from text widget
  138. untenTextMusikDatei.insert(INSERT, untererFrame.musikdatei) # insert selected file path to text widget
  139. untenTextMusikDatei.config(state=DISABLED) # activate text field (otherwise it is readonly)
  140. feedback("Musikdatei ausgewählt") # place text in feedback field, fontcololor, backgroundcolor
  141. def unten_button_filtere_tinnitus_aus_musik():
  142. print("button filtere tinnitus aus musik pressed")
  143. print(untenTextMusikDatei.get('1.0', END))
  144. if untenTextMusikDatei.get('1.0', END) == "Einen Song deiner Wahl hier auswählen\n":
  145. feedback("Wähle zuerst eine Musikdatei aus", "white", "red")
  146. else:
  147. unten_button_stop_press() # Wiedergabe beenden, durch den Rechenaufwand gibt es sonst Wiedergabeprobleme
  148. feedback("Starte Filtervorgang (dies kann etwas dauern)...", "blue")
  149. try:
  150. # Filtern in extra thread, damit sich die GUI nicht aufhängt: (daemon beendet den Thread, wenn das Hauptprogramm beendet wird)
  151. filter_thread = threading.Thread(target=sound.musik_filtern, daemon=True)
  152. filter_thread.start()
  153. safe_percentage = 0
  154. schritt = 0
  155. while filter_thread.is_alive():
  156. schritt_alt = schritt
  157. schritt = sound.filterfortschritt[0]
  158. if schritt > schritt_alt: # Prozentanzeige auf 0 zurücksetzen, wenn ein neuer Schritt beginnt
  159. safe_percentage = 0
  160. if schritt == 3 or schritt == 4: # Nur bei dem 3. und 4. Schritt wird der Fortschritt in Prozent angezeigt
  161. fb = "Schritt " + str(schritt) + " von 4 (" + str(safe_percentage) + "%)"
  162. if sound.filterfortschritt[1] > safe_percentage:
  163. feedback(fb)
  164. safe_percentage += 10
  165. elif schritt < 3 and schritt > schritt_alt:
  166. fb = "Schritt " + str(schritt) + " von 4"
  167. feedback(fb)
  168. root.update() # damit die GUI nicht eingefroren erscheint
  169. if sound.filterfortschritt[0] == 5: #ist 5, wenn erfolgreich gefiltert wurde
  170. print("-- filtern beendet --")
  171. feedback("Filtervorgang erfolgreich abgeschlossen. \n"
  172. "Audiodatei unter dem Namen gefilterteMusik.wav erstellt", "white", "green")
  173. else:
  174. print("Fehler bei Filterfunktion. Siehe Compiler-Meldungen")
  175. feedback("Fehlgeschlagener Filterversuch. Kontaktiere Entwickler und schreibe eventuell auf was genaud du gemacht hast", "red", "white")
  176. except:
  177. feedback("Fehlgeschlagener Filterversuch. Drücke zuerst den Speichern Knopf"
  178. "Stelle sicher, dass die Lautstärke mindestens einer Seite über 0"
  179. "gestellt ist. Sonst gehen wir davon aus, dass auf diesem Ohr kein Tinnitus vorliegt.", "red",
  180. "white")
  181. """--------------Feedback Funktion------------------"""
  182. def feedback(text, fontcolor="black", backgroundcolor="lightsteelblue"):
  183. """ This is a helper function. You can give it a string text and it will display it in the feedback frame (bottom
  184. right of the GUI) in the text widget. The parameter color is also a string and defines the font color. Same with
  185. background. Honestly this function is way too complicated, but Tkinter has no nicer/easier builtin way of doing the
  186. coloring nicely """
  187. feedback.lineCounter += 1 # in order to color the texts nicely we need to count the lines of text we add
  188. untenFeedbackText.config(state=NORMAL) # activate text field (otherwise it is readonly)
  189. if feedback.lineCounter == 12: # if we reached the end of the text box
  190. untenFeedbackText.delete("1.0", END) # just delete everything
  191. feedback.lineCounter = 1 # and start at line 1 again
  192. untenFeedbackText.insert(INSERT, text + "\n") # insert the text
  193. # these 2 lines just color the text nicely, but Tkinter forces your to first "tag_add" mark it and specify the
  194. # line number and char number you want to mark. And then "tag_config" change the color of this marked region
  195. untenFeedbackText.tag_add("Line"+str(feedback.lineCounter), str(feedback.lineCounter)+".0", str(float(len(text))))
  196. untenFeedbackText.tag_config("Line"+str(feedback.lineCounter), foreground=fontcolor, background=backgroundcolor)
  197. untenFeedbackText.config(state=DISABLED) # set the text field back to readonly
  198. root.update() #Damit der Text sofort ausgegeben wird, auch wenn das Programm erst noch was anderes macht
  199. """------------------ Initialisierungen --------------------------"""
  200. tinnitus = Tinnitus() # siehe SoundGenerator.py
  201. sound = Sound(tinnitus) # siehe SoundGenerator.py
  202. feedback.lineCounter = 0 # Funktionsvariable der Feedback funktion. Ein Funktionsaufruf Counter
  203. """---------------------------------- AUFBAU DES ROOT WINDOWS -----------------------------------------"""
  204. root = Tk() # build the main window
  205. root.title("Tinnitus Analyse")
  206. root.minsize(width=800, height=500) # set windowsize (width an height in pixels)
  207. root.resizable(False, False) # window not resizable (x and y)
  208. """------------------------------------------LINKER FRAME------------------------------------------------------------"""
  209. linkerFrame = LabelFrame(root, text="Linkes Ohr", font="bold") # parent is root, padding is extra space at the edges
  210. linkerFrame.grid(column=0, row=0, sticky=(N+W+E+S)) # the frame sticks to every side of the window when resized
  211. linksLautstärke = DoubleVar()
  212. linksFrequenz = DoubleVar()
  213. linksRauschenLautstärke = DoubleVar()
  214. linksRauschenFrequenzband = DoubleVar()
  215. # ------------------ LAUTSTÄRKE ------------------
  216. linksLabelLautstärke = Label(linkerFrame, text="Lautstärke [%]:")
  217. linksLabelLautstärke.grid(column=0, row=0, sticky=W)
  218. linksScaleLautstärke = Scale(linkerFrame, from_=0, to=100, orient=HORIZONTAL, length=600,
  219. command=links_scale_lautstärke_change)
  220. linksScaleLautstärke.grid(column=1, row=0, sticky=N+S+W+E)
  221. # -------- FREQUENZ ------------------------
  222. linksLabelFrequenz = Label(linkerFrame, text="Frequenz [kHz]")
  223. linksLabelFrequenz.grid(column=0, row=1, sticky=W) # sticky = w(est) makes the text left aligned
  224. linksScaleFrequenz = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  225. command=links_scale_frequenz_change)
  226. linksScaleFrequenz.grid(column=1, row=1, sticky=(W+E))
  227. # ----------- ABTRENNSTRICH ----------------
  228. linksSeparator = Separator(linkerFrame, orient="horizontal")
  229. linksSeparator.grid(column=0, row=2, sticky=(W + E), columnspan=3)
  230. # ----------- RAUSCHEN --------------------
  231. # Lautstärke
  232. linksLabelRauschenLautstärke = Label(linkerFrame, text="Rauschen Lautstärke %", anchor="w")
  233. linksLabelRauschenLautstärke.grid(column=0, row=3, sticky=W)
  234. linksScaleRauschenLautstärke = Scale(linkerFrame, from_=0, to=100, orient=HORIZONTAL, length=600,
  235. command=links_scale_rauschen_lautstärke_change)
  236. linksScaleRauschenLautstärke.grid(column=1, row=3, sticky=(W+E))
  237. # Obere Grenzfrequenz
  238. linksLabelObereGrenzfrequenz = Label(linkerFrame, text="Obere Grenzfrequenz [kHz]", anchor="w")
  239. linksLabelObereGrenzfrequenz.grid(column=0, row=4, sticky=W)
  240. linksScaleObereGrenzfrequenz = Scale(linkerFrame, from_=0.02, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  241. command=links_scale_obere_grenzfrequenz_change)
  242. linksScaleObereGrenzfrequenz.grid(column=1, row=4, sticky=(W+E))
  243. linksScaleObereGrenzfrequenz.set(20.00)
  244. # Untere Grenzfrequenz
  245. linksLabelUntereGrenzfrequenz = Label(linkerFrame, text="Untere Grenzfrequenz [kHz]", anchor="w")
  246. linksLabelUntereGrenzfrequenz.grid(column=0, row=5, sticky=(W+E))
  247. linksScaleUntereGrenzfrequenz = Scale(linkerFrame, from_=0.01, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  248. command=links_scale_untere_grenzfrequenz_change)
  249. linksScaleUntereGrenzfrequenz.grid(column=1, row=5, sticky=(W+E))
  250. linksScaleUntereGrenzfrequenz.set(0.01)
  251. """----------------------------------------------RECHTER FRAME-------------------------------------------------------"""
  252. rechterFrame = LabelFrame(root, text="Rechtes Ohr", font="bold")
  253. rechterFrame.grid(column=1, row=0, sticky=(N+E+W+S))
  254. # Variablen Rechts
  255. rechtsFrequenz = DoubleVar()
  256. rechtsRauschenLautstärke = DoubleVar()
  257. rechtsRauschenFrequenzband = DoubleVar()
  258. rechtsLautstärke = DoubleVar()
  259. # ------------------ LAUTSTÄRKE ------------------
  260. rechtsLabelLautstärke = Label(rechterFrame, text="Lautstärke [%]:")
  261. rechtsLabelLautstärke.grid(column=0, row=0, sticky=W)
  262. rechtsScaleLautstärke = Scale(rechterFrame, from_=0, to=100, orient=HORIZONTAL, length=600,
  263. command=rechts_scale_lautstärke_change)
  264. rechtsScaleLautstärke.grid(column=1, row=0, columnspan=10, sticky=W)
  265. # -------- FREQUENZ ------------------------
  266. rechtsLabelFrequenz = Label(rechterFrame, text="Frequenz [kHz]")
  267. rechtsLabelFrequenz.grid(column=0, row=1, sticky=W) # sticky = w(est) makes the text left aligned
  268. rechtsScaleFrequenz = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  269. command=rechts_scale_frequenz_change)
  270. rechtsScaleFrequenz.grid(column=1, row=1, columnspan=10, sticky=(W+E))
  271. # ----------- ABTRENNSTRICH ----------------
  272. rechtsSeparator = Separator(rechterFrame, orient="horizontal")
  273. rechtsSeparator.grid(column=0, row=2, columnspan=10, sticky=(W + E))
  274. # ----------- RAUSCHEN --------------------
  275. rechtsLabelRauschenLautstärke = Label(rechterFrame, text="Rauschen Lautstärke %", anchor="w")
  276. rechtsLabelRauschenLautstärke.grid(column=0, row=3, sticky=W)
  277. rechtsScaleRauschenLautstärke = Scale(rechterFrame, from_=0, to=100, orient=HORIZONTAL, length=600,
  278. command=rechts_scale_rauschen_lautstärke_change)
  279. rechtsScaleRauschenLautstärke.grid(column=1, row=3, sticky=(W+E))
  280. # Obere Grenzfrequenz
  281. rechtsLabelObereGrenzfrequenz = Label(rechterFrame, text="Obere Grenzfrequenz [kHz]", anchor="w")
  282. rechtsLabelObereGrenzfrequenz.grid(column=0, row=4, sticky=W)
  283. rechtsScaleObereGrenzfrequenz = Scale(rechterFrame, from_=0.02, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  284. command=rechts_scale_obere_grenzfrequenz_change)
  285. rechtsScaleObereGrenzfrequenz.grid(column=1, row=4, sticky=(W+E))
  286. rechtsScaleObereGrenzfrequenz.set(20.00)
  287. # Untere Grenzfrequenz
  288. rechtsLabelUntereGrenzfrequenz = Label(rechterFrame, text="Untere Grenzfrequenz [kHz]", anchor="w")
  289. rechtsLabelUntereGrenzfrequenz.grid(column=0, row=5, sticky=(W+E))
  290. rechtsScaleUntereGrenzfrequenz = Scale(rechterFrame, from_=0.01, to=20, orient=HORIZONTAL, length=600, resolution=-1.0,
  291. command=rechts_scale_untere_grenzfrequenz_change)
  292. rechtsScaleUntereGrenzfrequenz.grid(column=1, row=5, sticky=(W+E))
  293. rechtsScaleUntereGrenzfrequenz.set(0.01)
  294. """------------------------------------------------ UNTERER LINKER FRAME---------------------------------------------"""
  295. untererFrame = LabelFrame(root, text="Generelles", border=10)
  296. untererFrame.grid(column=0, row=1, sticky=(N + W + S + E))
  297. vorname = StringVar() # Name des Patienten als String um den generierten Tinnitus später zuordnen zu können
  298. nachname = StringVar()
  299. kommentare = StringVar() # Ein Feld in dass der Patient noch weitere Kommentare angeben kann
  300. # Den unteren Frame füllen----------------------------------------------------------------------------------------------
  301. # --------- OHREN SYNCHRONISIEREN -----------------------
  302. untenLabelOhrenSynchro = Label(untererFrame, text="Einstellungen von ")
  303. untenLabelOhrenSynchro.grid(column=0, row=0, sticky=(N + W))
  304. untenComboOhrenSynchro = Combobox(untererFrame, values=["Linkes Ohr", "Rechtes Ohr"])
  305. untenComboOhrenSynchro.grid(column=1, row=0, sticky=(N + W + E + S))
  306. untenLabelOhrenSynchro2 = Label(untererFrame, text=" für beide übernehmen")
  307. untenLabelOhrenSynchro2.grid(column=2, row=0, sticky=(N + W + E + S))
  308. untenButtonOhrenSynchro = Button(untererFrame, text="Bestätigen",
  309. command=unten_button_ohren_synchro)
  310. untenButtonOhrenSynchro.grid(column=3, row=0, sticky=(N + S))
  311. #----------- PLAY BUTTON
  312. untenButtonPlay = Button(untererFrame, text="PLAY", font="bold", relief="raised", bg="green", fg="white",
  313. command=unten_button_play_press)
  314. untenButtonPlay.grid(column=7, row=0, sticky=(N + W + E + S))
  315. #------------STOP BUTTON-------------
  316. untenButtonStop = Button(untererFrame, text="STOP", font="bold", relief="raised", bg="red", fg="white",
  317. command=unten_button_stop_press)
  318. untenButtonStop.grid(column=8, row=0, sticky=(N + W + E + S))
  319. # ----------- ABTRENNSTRICHE ----------------
  320. untenSeparator = Separator(untererFrame, orient="horizontal")
  321. untenSeparator.grid(column=0, row=1, columnspan=10, sticky=(W + E))
  322. untenSeperator2 = Separator(untererFrame, orient="vertical")
  323. untenSeperator2.grid(column=5, rowspan=5, sticky=N+S)
  324. # ------------NAMENSEINGABE-------------
  325. untenLabelNachname = Label(untererFrame, text="Nachname:")
  326. untenLabelNachname.grid(column=0, row=2, sticky=W)
  327. untenEntryNachname = Entry(untererFrame, textvariable=nachname)
  328. untenEntryNachname.grid(column=1, row=2, sticky=W)
  329. untenLabelVorname = Label(untererFrame, text="Vorname:")
  330. untenLabelVorname.grid(column=0, row=3, sticky=W)
  331. untenEntryVorname = Entry(untererFrame, textvariable=vorname)
  332. untenEntryVorname.grid(column=1, row=3, sticky=W)
  333. # ------------ KOMMENTAR ----------------
  334. untenLabelKommentar = Label(untererFrame, text="weitere Kommentare:")
  335. untenLabelKommentar.grid(column=0, row=4, sticky=W)
  336. untenLabelKommentar = Label(untererFrame, text="(optional)")
  337. untenLabelKommentar.grid(column=0, row=5, sticky=N)
  338. untenTextKommentar = Text(untererFrame, height=10, width=60) # create a field where u can enter text
  339. untenTextKommentar.grid(column=1, row=4, sticky=W, columnspan=3, rowspan=3)
  340. # ----------- SPEICHERN --------------------
  341. untenButtonSpeichern = Button(untererFrame, text="Speichern", font="bold",
  342. command=unten_button_speichern_press)
  343. untenButtonSpeichern.grid(column=4, row=6, sticky=(S+E+W))
  344. """--------------------------------------UNTERER RECHTER FRAME-------------------------------------------------------"""
  345. untererRechterFrame = LabelFrame(root, text="Programm Feedback")
  346. untererRechterFrame.grid(row=1, column=1, sticky=(N+S+E+W))
  347. # ------------ PROGRAMM OUTPUT ------------
  348. untenFeedbackText = Text(untererRechterFrame, height=13, width=85, bg="lightsteelblue") # write feedback to patient here
  349. #untenFeedbackText.config(state=DISABLED) # make the text widget readonly
  350. untenFeedbackText.place(relx=.5, rely=.5, anchor="center") # the only time I used .place instead of grid, because it
  351. # lets me place the widget in the middle of the frame
  352. # -------------- LOAD MUSIC FILE--------------
  353. untenTextMusikDatei = Text(untererFrame, height=1, width=50)
  354. untenTextMusikDatei.grid(column=1, row=7, sticky=(N+S+E+W), columnspan=4)
  355. untenTextMusikDatei.insert(INSERT, "Einen Song deiner Wahl hier auswählen") # insert selected file path to text widget
  356. untenTextMusikDatei.config(state=DISABLED, font=("Arial", 8)) # activate text field (otherwise it is readonly)
  357. untenButtonMusikDateiLaden = Button(untererFrame, text="Musikdatei auswählen",
  358. command=unten_button_musikdatei_laden_press)
  359. untenButtonMusikDateiLaden.grid(column=4, row=7, sticky=(N+S+E+W))
  360. #------------BUTTON FILTERE TINNITUS AUS MUSIK-----------------
  361. untenButtonFiltereTinnitusAusMusik = Button(untererFrame, text="Filtere Tinnitus-Frequenzen aus Musik",
  362. command=unten_button_filtere_tinnitus_aus_musik, font="bold",
  363. relief="raised", bg="blue", fg="white",)
  364. untenButtonFiltereTinnitusAusMusik.grid(column=3, row=9, sticky=(N+S+E+W), columnspan=3)
  365. root.mainloop()