From b73ae42745284a58cdf3e0ef457d9dc7eb25ac17 Mon Sep 17 00:00:00 2001 From: seyffejn <55194230+seyffejn@users.noreply.github.com> Date: Tue, 9 Jun 2020 15:13:00 +0200 Subject: [PATCH] GUI update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Große Änderung: 1) Aufteilung in links u rechts, statt l,r und beide 2) Tonänderungen mittels größerer Schieberegler realisiert 3) Alle Widgets mit Funktionen verbunden 4) farbige PLAY & STOP Button hinzugefügt, bisher ohne Funktion 5) Wenn man Speichern drückt, wird erst geprüft ob man einen Namen eingegeben hat 6) Funktionalität linkes/rechtes Ohr auf jeweils Anderes implementiert 7) Viele kleine visuelle Änderungen --- .gitignore | 4 + TinnitusAnalyse/.idea/dictionaries/Julian.xml | 12 + TinnitusAnalyse/.idea/workspace.xml | 113 ++++-- TinnitusAnalyse/TinnitusAnalyse_GUI.py | 340 ++++++++++++------ 4 files changed, 339 insertions(+), 130 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15fe31b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ + +TinnitusAnalyse/.idea/dictionaries/Julian.xml +TinnitusAnalyse/.idea/workspace.xml +TinnitusAnalyse/eggs.csv diff --git a/TinnitusAnalyse/.idea/dictionaries/Julian.xml b/TinnitusAnalyse/.idea/dictionaries/Julian.xml index 1023142..ee120ee 100644 --- a/TinnitusAnalyse/.idea/dictionaries/Julian.xml +++ b/TinnitusAnalyse/.idea/dictionaries/Julian.xml @@ -2,18 +2,30 @@ audioausgabe + bandbreite beide beiden + definieren frequenz + kommentare lautstärke linkem + linken linkes + mittel + mittelfrequenz nachname ohren rauschen + rauschens rechtem + rechten + rechter rechtes + rechts + variablen vorname + zwischen \ No newline at end of file diff --git a/TinnitusAnalyse/.idea/workspace.xml b/TinnitusAnalyse/.idea/workspace.xml index 052a5c0..f7d9086 100644 --- a/TinnitusAnalyse/.idea/workspace.xml +++ b/TinnitusAnalyse/.idea/workspace.xml @@ -2,9 +2,7 @@ - - @@ -15,14 +13,35 @@ - + - - + + - + + + + + + + + + + + + + + + + + + + + + + @@ -31,7 +50,7 @@ - + @@ -50,7 +69,14 @@ ttk mainFrame + aktLabelFrame linkerFrame + Var + Entry + Scale + linker + für alle + scale_lautstärke_links_change C:\Users\Julian\PycharmProjects\TinnitusAnalyse @@ -67,10 +93,10 @@ - @@ -102,7 +128,28 @@ - + + + + @@ -145,15 +193,14 @@ - - - + + @@ -189,29 +236,39 @@ + + + + + + + + + + - - + + + + + + + + + + + + - + - - - - - - - - - - \ No newline at end of file diff --git a/TinnitusAnalyse/TinnitusAnalyse_GUI.py b/TinnitusAnalyse/TinnitusAnalyse_GUI.py index 1d59999..d9950a7 100644 --- a/TinnitusAnalyse/TinnitusAnalyse_GUI.py +++ b/TinnitusAnalyse/TinnitusAnalyse_GUI.py @@ -1,136 +1,272 @@ -from tkinter import * # all the classic tkinter stuff -from tkinter.ttk import Frame, Label, Button, LabelFrame, Combobox, Style, Checkbutton, Entry, Panedwindow - -# FUNKTIONEN DIE DURCH GUI KLICKS AUSGEFÜHRT WERDEN--------------------------------------------------------------------- - -def button_rauschen_minus_press(): - print("Rauschen_Press_Plus pressed") +from tkinter.ttk import Frame, Label, Button, LabelFrame, Combobox, Style, Checkbutton, Entry, Panedwindow, Separator +from tkinter import * +import csv -def button_rauschen_plus_press(): - print("Rauschen Press_Minus pressed") +"""--------------------------FUNKTIONEN DIE DURCH GUI KLICKS AUSGEFÜHRT WERDEN---------------------------------------""" +"""-------Funktionen links-------------""" -# Ohr (links/beide/rechts) -def button_linkes_ohr_press(): - print("button linkes ohr pressed") +def links_scale_lautstärke_change(self): + linksLautstärke = float(linksScaleLautstärke.get()) + print("Links Lautstärke =", linksLautstärke) -def button_beide_ohren_press(): - print("button beide ohren pressed") +def links_scale_frequenz_change(self): + linksFrequenz = float(linksScaleFrequenz.get()) + print("Links Frequenz = ", linksFrequenz) -def button_rechtes_ohr_press(): - print("button rechtes ohr pressed") +def links_scale_rauschen_lautstärke_change(self): + linksRauschenLautstärke = float(linksScaleRauschenLautstärke.get()) + print("Links Rauschen Lautstärke = ", linksRauschenLautstärke) -# Lautstärke -def scale_lautstärke_change(self): - lautstärke = float(scaleLautstärke.get()) - print(lautstärke) - -def button_ohren_synchro(): - auswahl = comboOhrenSynchro.get() # holt die momentane Auswahl aus combobox - print("Einstellungen von:" + auswahl + " auf alle anderen Ohren setzen") +def links_scale_rauschen_mittelfrequenz_change(self): + linksRauschenMittelfrequenz = float(linksScaleRauschenMittelFrequenz.get()) + print("Links Rauschen Mittelfrequenz = ", linksRauschenMittelfrequenz) -# AUFBAU DES ROOT WINDOWS ---------------------------------------------------------------------------------------------- +def links_scale_rauschen_bandbreite_change(self): + linksRauschenBandbreite = float(linksScaleRauschenBandbreite.get()) + print("Links Rauschen Bandbreite = ", linksRauschenBandbreite) + + +"""----------Funktionen rechts----------""" + + +def rechts_scale_lautstärke_change(self): + rechtsLautstärke = float(rechtsScaleLautstärke.get()) + print("Rechts Lautstärke =", rechtsLautstärke) + + +def rechts_scale_frequenz_change(self): + rechtsFrequenz = float(rechtsScaleFrequenz.get()) + print("Rechts Frequenz= ", rechtsFrequenz) + + +def rechts_scale_rauschen_lautstärke_change(self): + rechtsRauschenLautstärke = float(rechtsScaleRauschenLautstärke.get()) + print("Rechts Rauschen Lautstärke = ", rechtsRauschenLautstärke) + + +def rechts_scale_rauschen_mittelfrequenz_change(self): + rechtsRauschenMittelfrequenz = float(rechtsScaleRauschenMittelFrequenz.get()) + print("Rechts Rauschen Mittelfrequenz = ", rechtsRauschenMittelfrequenz) + + +def rechts_scale_rauschen_bandbreite_change(self): + rechtsRauschenBandbreite = float(rechtsScaleRauschenBandbreite.get()) + print("Rechts Rauschen Bandbreite = ", rechtsRauschenBandbreite) + + +"""--------------Funktionen unten------------------""" + + +def unten_button_ohren_synchro(): + auswahl = untenComboOhrenSynchro.get() # holt die momentane Auswahl aus combobox + print("Einstellungen von:" + auswahl + " das auf das jeweils andere Ohr setzen") + + if auswahl == "Linkes Ohr": # linkes --> rechts + rechtsScaleLautstärke.set(linksScaleLautstärke.get()) + rechtsScaleFrequenz.set(linksScaleFrequenz.get()) + rechtsScaleRauschenLautstärke.set(linksScaleRauschenLautstärke.get()) + rechtsScaleRauschenMittelFrequenz.set(linksScaleRauschenMittelFrequenz.get()) + rechtsScaleRauschenBandbreite.set(linksScaleRauschenBandbreite.get()) + + if auswahl == "Rechtes Ohr": # rechts --> links + linksScaleLautstärke.set(rechtsScaleLautstärke.get()) + linksScaleFrequenz.set(rechtsScaleFrequenz.get()) + linksScaleRauschenLautstärke.set(rechtsScaleRauschenLautstärke.get()) + linksScaleRauschenMittelFrequenz.set(rechtsScaleRauschenMittelFrequenz.get()) + linksScaleRauschenBandbreite.set(rechtsScaleRauschenBandbreite.get()) + + +def unten_button_speichern_press(): + print("button speichern pressed") + # Wenn man Speichern will bevor ein Name eingegeben wurde + if (not untenEntryVorname.get()) or (not untenEntryNachname.get()) or \ + (untenEntryNachname == "Erst Namen..") or (untenEntryVorname == "..eintragen bitte"): + nachname.set("Erst Namen..") + vorname.set("..eintragen bitte") + else: + print("TEST") + + +def unten_button_play_press(): + print("button play pressed") + + +def unten_button_stop_press(): + print("button stop press") + + +"""------------------------------------------ AUFBAU DES ROOT WINDOWS -----------------------------------------------""" root = Tk() # build the main window root.title("Tinnitus Analyse") #root.iconbitmap('headphones.ico') #todo: fix icon -root.minsize(width=800, height=600) +#root.minsize(width=200, height=600) root.resizable(True, True) -#root.columnconfigure(0, weight=1) -root.rowconfigure(0, weight=1) # extra platz nach unten wird automatisch von Frames eingenommen +root.columnconfigure(0, weight=1) # falls freier Platz im Fenster ist, werden die Frames diesen benutzen +root.rowconfigure(0, weight=1) -# DIE DREI OBEREN FRAMES AUFBAUEN--------------------------------------------------------------------------------------- -linkerFrame = LabelFrame(root, text="linkes Ohr", width=100, height = 100, padding="3 3 30 30") # parent is root, padding is extra space at the edges -linkerFrame.grid(column=0, row=0, sticky=(N + W + E + S)) # the frame sticks to every side of the window when resized +"""------------------------------------------LINKER FRAME------------------------------------------------------------""" +linkerFrame = LabelFrame(root, text="Linkes Ohr", font="bold") # parent is root, padding is extra space at the edges +linkerFrame.grid(column=0, row=0, sticky=(N + W + E)) # the frame sticks to every side of the window when resized -mittlererFrame = LabelFrame(root, text="beide Ohren", width=100, height=100, padding="3 3 30 30") -mittlererFrame.grid(column=1, row=0, sticky=(N + W + E + S)) +linksLautstärke = DoubleVar() +linksFrequenz = DoubleVar() +linksRauschenLautstärke = DoubleVar() +linksRauschenFrequenzband = DoubleVar() -rechterFrame = LabelFrame(root, text="rechtes Ohr", width=100, height=100, padding="3 3 30 30") -rechterFrame.grid(column=2, row=0, sticky=(N + W + E + S)) +# ------------------ LAUTSTÄRKE ------------------ +linksLabelLautstärke = Label(linkerFrame, text="Lautstärke [%]:") +linksLabelLautstärke.grid(column=0, row=0, sticky=W) +linksScaleLautstärke = Scale(linkerFrame, from_=0, to=100, orient=HORIZONTAL, length=700, + command=links_scale_lautstärke_change) +linksScaleLautstärke.grid(column=1, row=0, columnspan=10, sticky=W) + +# -------- FREQUENZ ------------------------ +linksLabelFrequenz = Label(linkerFrame, text="Frequenz [kHz]") +linksLabelFrequenz.grid(column=0, row=1, sticky=W) # sticky = w(est) makes the text left aligned +linksScaleFrequenz = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=700, resolution=-1.0, + command=links_scale_frequenz_change) +linksScaleFrequenz.grid(column=1, row=1, columnspan=10, sticky=(W+E)) + +# ----------- ABTRENNSTRICH ---------------- +linksSeparator = Separator(linkerFrame, orient="horizontal") +linksSeparator.grid(column=0, row=2, columnspan=10, sticky=(W + E)) + +# ----------- RAUSCHEN -------------------- +linksLabelRauschenLautstärke = Label(linkerFrame, text="Rauschen Lautstärke %", anchor="w") +linksLabelRauschenLautstärke.grid(column=0, row=3, sticky=W) +linksScaleRauschenLautstärke = Scale(linkerFrame, from_=0, to=100, orient=HORIZONTAL, length=700, + command=links_scale_rauschen_lautstärke_change) +linksScaleRauschenLautstärke.grid(column=1, row=3, sticky=(W+E)) + +linksLabelRauschenMittelFrequenz = Label(linkerFrame, text="Rauschen Mittelfrequenz [kHz]", anchor="w") +linksLabelRauschenMittelFrequenz .grid(column=0, row=4) +linksScaleRauschenMittelFrequenz = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=700, resolution=-1.0, + command=links_scale_rauschen_mittelfrequenz_change) +linksScaleRauschenMittelFrequenz.grid(column=1, row=4) + +linksLabelRauschenBandbreite= Label(linkerFrame, text="Rauschen Bandbreite [kHz]", anchor="w") +linksLabelRauschenBandbreite.grid(column=0, row=5, sticky=W) +linksScaleRauschenBandbreite = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=700, resolution=-1.0, + command=links_scale_rauschen_bandbreite_change) +linksScaleRauschenBandbreite.grid(column=1, row=5, sticky=(W+E)) -# DIE DREI OBEREN FRAMES FÜLLEN----------------------------------------------------------------------------------------- -labelFrames = [linkerFrame, mittlererFrame, rechterFrame] -for aktLabelFrame in labelFrames: - # -------- FREQUENZ ------------------------ - labelFrequenz = Label(aktLabelFrame, text="Frequenz [kHz]") - labelFrequenz.grid(row=0, column=0, sticky=W) # sticky = w(est) makes the text left aligned - frequenz = DoubleVar() # Frequenz Variable [kHz] - entryFrequenz = Entry(aktLabelFrame, textvariable=frequenz) # create a field where u can enter text - entryFrequenz.grid(column=1, row=0, sticky=W) # position the field - # todo: Failproof the entry field to just numbers between a range! - # todo: add function to entry change! - # ----------- RAUSCHEN -------------------- - # todo: iwas überlegen ich brauch 3 verschiedene stringVars eigentlich für jedes Ohr!!! - # todo: add function to entry change - labelRauschen = Label(aktLabelFrame, text="Rauschen[+/- kHz]", anchor="w") - labelRauschen.grid(column=0, row=1, sticky=W) - buttonRauschenPlus = Button(aktLabelFrame, text="+", command=button_rauschen_plus_press) - buttonRauschenPlus.grid(column=2, row=1) - buttonRauschenMinus = Button(aktLabelFrame, text="-", command=button_rauschen_minus_press) - buttonRauschenMinus.grid(column=3, row=1) - rauschen = StringVar() # Rauschen Variable [+/- kHz] - entryRauschen = Entry(aktLabelFrame, textvariable=rauschen) # create a field where u can enter text - entryRauschen.grid(column=1, row=1, sticky=W) # position the field - # ------------------ LAUTSTÄRKE ------------------ - labelLautstärke = Label(aktLabelFrame, text="Lautstärke [%]:") - labelLautstärke.grid(column=0, row=3, sticky="w") - scaleLautstärke = Scale(aktLabelFrame, from_=0, to=100, orient=HORIZONTAL, length=200, command=scale_lautstärke_change) - scaleLautstärke.grid(column=1, row=3, columnspan=2) - # ------------ KOMMENTAR ---------------- - labelKommentar = Label(aktLabelFrame, text="weitere Kommentare:") - labelKommentar.grid(column=0, row=4) - kommentar = StringVar() # Rauschen Variable [+/- kHz] - entryKommentar = Entry(aktLabelFrame, textvariable=kommentar, width=33) # create a field where u can enter text - entryKommentar.grid(column=1, row=4, rowspan=4, columnspan=2, sticky=W) +"""----------------------------------------------RECHTER FRAME-------------------------------------------------------""" +rechterFrame = LabelFrame(root, text="Rechtes Ohr", font="bold") +rechterFrame.grid(column=2, row=0, sticky=(N + E + W)) + +# Variablen Rechts +rechtsFrequenz = DoubleVar() +rechtsRauschenLautstärke = DoubleVar() +rechtsRauschenFrequenzband = DoubleVar() +rechtsLautstärke = DoubleVar() + +# ------------------ LAUTSTÄRKE ------------------ +rechtsLabelLautstärke = Label(rechterFrame, text="Lautstärke [%]:") +rechtsLabelLautstärke.grid(column=0, row=0, sticky=W) +rechtsScaleLautstärke = Scale(rechterFrame, from_=0, to=100, orient=HORIZONTAL, length=700, + command=rechts_scale_lautstärke_change) +rechtsScaleLautstärke.grid(column=1, row=0, columnspan=10, sticky=W) + +# -------- FREQUENZ ------------------------ +rechtsLabelFrequenz = Label(rechterFrame, text="Frequenz [kHz]") +rechtsLabelFrequenz.grid(column=0, row=1, sticky=W) # sticky = w(est) makes the text left aligned +rechtsScaleFrequenz = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=700, resolution=-1.0, + command=rechts_scale_frequenz_change) +rechtsScaleFrequenz.grid(column=1, row=1, columnspan=10, sticky=(W+E)) + +# ----------- ABTRENNSTRICH ---------------- +rechtsSeparator = Separator(rechterFrame, orient="horizontal") +rechtsSeparator.grid(column=0, row=2, columnspan=10, sticky=(W + E)) + +# ----------- RAUSCHEN -------------------- +rechtsLabelRauschenLautstärke = Label(rechterFrame, text="Rauschen Lautstärke %", anchor="w") +rechtsLabelRauschenLautstärke.grid(column=0, row=3, sticky=W) +rechtsScaleRauschenLautstärke = Scale(rechterFrame, from_=0, to=100, orient=HORIZONTAL, length=700, + command=rechts_scale_rauschen_lautstärke_change) +rechtsScaleRauschenLautstärke.grid(column=1, row=3, sticky=(W+E)) + +rechtsLabelRauschenMittelFrequenz = Label(rechterFrame, text="Rauschen Mittelfrequenz [kHz]", anchor="w") +rechtsLabelRauschenMittelFrequenz .grid(column=0, row=4) +rechtsScaleRauschenMittelFrequenz = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=700, resolution=-1.0, + command=rechts_scale_rauschen_mittelfrequenz_change) +rechtsScaleRauschenMittelFrequenz.grid(column=1, row=4) + +rechtsLabelRauschenBandbreite = Label(rechterFrame, text="Rauschen Bandbreite [kHz]", anchor="w") +rechtsLabelRauschenBandbreite.grid(column=0, row=5, sticky=W) +rechtsScaleRauschenBandbreite = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=700, resolution=-1.0, + command=rechts_scale_rauschen_bandbreite_change) +rechtsScaleRauschenBandbreite.grid(column=1, row=5, sticky=(W+E)) -# DEN UNTEREN FRAME BAUEN----------------------------------------------------------------------------------------------- -untererFrame = LabelFrame(root, text="Generelles", width=300, height=100, padding="3 3 30 30") -untererFrame.grid(column=0, row=1, columnspan=3, sticky=(N + W + E + S)) +"""------------------------------------------------ UNTERER FRAME----------------------------------------------------""" +untererFrame = LabelFrame(root, text="Generelles", border=10) +untererFrame.grid(column=0, row=1, sticky=(N + W + S)) -# DEN UNTEREN FRAME FÜLLEN---------------------------------------------------------------------------------------------- -# ------------NAMENSEINGABE------------- -labelNachname = Label(untererFrame, text="Nachname:") -labelNachname.grid(column=0, row=0) +vorname = StringVar() # Name des Patienten als String um den generierten Tinnitus später zuordnen zu können nachname = StringVar() -entryNachname = Entry(untererFrame, textvariable=nachname) -entryNachname.grid(column=1, row=0) -labelVorname = Label(untererFrame, text="Vorname:") -labelVorname.grid(column=2, row=0) -vorname = StringVar() -entryVorname = Entry(untererFrame, textvariable=vorname) -entryVorname.grid(column=3, row=0) -# ------------------OHRENAUSWAHL----------- -labelOhren = Label(untererFrame, text="Audioausgabe auf:") -labelOhren.grid(column=0, row=1, sticky="w") -buttonLinkesOhr = Button(untererFrame, text="linkem Ohr", command=button_linkes_ohr_press) -buttonLinkesOhr.grid(column=1, row=1) -buttonBeideOhren = Button(untererFrame, text="beiden Ohren", command=button_beide_ohren_press) -buttonBeideOhren.grid(column=2, row=1) -buttonRechtesOhr = Button(untererFrame, text="rechtem Ohr", command=button_rechtes_ohr_press) -buttonRechtesOhr.grid(column=3, row=1) +kommentare = StringVar() # Ein Feld in dass der Patient noch weitere Kommentare angeben kann +# Den unteren Frame füllen---------------------------------------------------------------------------------------------- + # --------- OHREN SYNCHRONISIEREN ----------------------- -labelOhrenSynchro = Label(untererFrame, text="Einstellungen von ") -labelOhrenSynchro.grid(column=0, row=2) -comboOhrenSynchro = Combobox(untererFrame, values=["Linkes Ohr", "Rechtes Ohr", "Beide Ohren"]) -comboOhrenSynchro.grid(column=1, row=2) -labelOhrenSynchro2 = Label(untererFrame, text=" für alle anderen Ohren übernehmen") -labelOhrenSynchro2.grid(column=2, row=2) -buttonOhrenSynchro = Button(untererFrame, text="Bestätigen", command=button_ohren_synchro) -buttonOhrenSynchro.grid(column=3, row=2) +untenLabelOhrenSynchro = Label(untererFrame, text="Einstellungen von ") +untenLabelOhrenSynchro.grid(column=0, row=0, sticky=(N + W)) +untenComboOhrenSynchro = Combobox(untererFrame, values=["Linkes Ohr", "Rechtes Ohr"]) +untenComboOhrenSynchro.grid(column=1, row=0, sticky=(N + W + E + S)) +untenLabelOhrenSynchro2 = Label(untererFrame, text=" für beide übernehmen") +untenLabelOhrenSynchro2.grid(column=2, row=0, sticky=(N + W + E + S)) +untenButtonOhrenSynchro = Button(untererFrame, text="Bestätigen", + command=unten_button_ohren_synchro) +untenButtonOhrenSynchro.grid(column=3, row=0, sticky=(N + W + E + S)) + +#----------- PLAY BUTTON +untenButtonPlay = Button(untererFrame, text="PLAY", font="bold", relief="raised", bg="green", fg="white", + command=unten_button_play_press) +untenButtonPlay.grid(column=8, row=0, sticky=(N + W + E + S)) + +#------------STOP BUTTON------------- +untenButtonStop = Button(untererFrame, text="STOP", font="bold", relief="raised", bg="red", fg="white", + command=unten_button_stop_press) +untenButtonStop.grid(column=9, row=0, sticky=(N + W + E + S)) + +# ----------- ABTRENNSTRICHE ---------------- +untenSeparator = Separator(untererFrame, orient="horizontal") +untenSeparator.grid(column=0, row=1, columnspan=10, sticky=(W + E)) + +untenSeperator2 = Separator(untererFrame, orient="vertical") +untenSeperator2.grid(column=5, rowspan=5, sticky=N+S) + +# ------------NAMENSEINGABE------------- +untenLabelNachname = Label(untererFrame, text="Nachname:") +untenLabelNachname.grid(column=0, row=2, sticky=W) +untenEntryNachname = Entry(untererFrame, textvariable=nachname) +untenEntryNachname.grid(column=1, row=2, sticky=W) +untenLabelVorname = Label(untererFrame, text="Vorname:") +untenLabelVorname.grid(column=0, row=3, sticky=W) +untenEntryVorname = Entry(untererFrame, textvariable=vorname) +untenEntryVorname.grid(column=1, row=3, sticky=W) + +# ------------ KOMMENTAR ---------------- +untenLabelKommentar = Label(untererFrame, text="weitere Kommentare:") +untenLabelKommentar.grid(column=0, row=4, sticky=W) +untenTextKommentar = Text(untererFrame, height=10, width=50) # create a field where u can enter text +untenTextKommentar.grid(column=1, row=4, columnspan=3, rowspan=3) # ----------- SPEICHERN -------------------- -buttonSpeichern = Button(untererFrame, text="SPEICHERN") -buttonSpeichern.grid(column=6, row=3) +untenButtonSpeichern = Button(untererFrame, text="Speichern", font="bold", + command=unten_button_speichern_press) +untenButtonSpeichern.grid(column=4, row=6, sticky=S) +# todo: , relief="raised" für play button + root.mainloop() \ No newline at end of file