Toplevel Fenster: Entry Inhalt speichern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benni_
User
Beiträge: 2
Registriert: Sonntag 25. Oktober 2020, 16:17

Hallo,
ich möchte in einem root Fenster ein Toplevel Fenster öffnen. In den Toplevel Fenster soll des dem Benutzer des Programms möglich sein, einen Pfad zu einer CSV anzugeben. Anschließend soll der Pfad nach einen klick auf den Button als String in eine globale Variable gespeichert werden. Zukünftig wird der String in einer txt-Datei gespeichert, damit die Pfadeinstellung auch nach einen Programm-Neustart vorhanden ist.
Mein Problem ist, dass der Funktion meines Buttons zum Speichern des Pfades die Entry unbekannt ist. Kann ich der Funktion irgendwie den Inhalt der Entry nach einen Knopfdruck irgendwie übergeben?

Hier der Sachverhalt als CODE:

Code: Alles auswählen

import tkinter as tk 

CSV_Pfad =""

def csv_pfad_neu():
    global CSV_Pfad
    CSV_Pfad = E_Pfad.get()
    print(CSV_Pfad)
 
    
def neuesfenster():
    fenster_2 = tk.Toplevel(fenster)
    label1 = tk.Label(fenster_2, text= " CSV Pfad:")
    E_Pfad = tk.Entry(fenster_2)
    E_Pfad.insert(0, CSV_Pfad)
    button_pfad= tk.Button(fenster_2,text="Übernehmen", command = csv_pfad_neu())
    label1.pack()
    E_Pfad.pack()
    button_pfad.pack()


fenster= tk.Tk()
button1= tk.Button(fenster,text="neues Fenster", command = neuesfenster )
button1.pack()
fenster.mainloop()
Ich bin noch Anfänger in Python, hoffentlich ist der Code nicht totaler Müll. :lol:
Vielen Dank für euere Hilfe! :)
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Benni_: Vergiss ``global``. Das verwendet man nicht. Schon gar nicht wenn man sowieso objektorientiert programmieren muss, also eigene Klasse(n) schreiben muss, denn darum kommt man bei jedem nicht-trivialen GUI-Programm nicht herum. Objektorientierte Programmierung ist dann auch die Antwort auf Dein Problem.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Namen sollten weder kryptische Abkürzungen enthalten, noch nummeriert sein. `button_pfad` bedeutet etwas anderes als `pfad_button` (es sei denn man ist Meister Yoda).

Du machst bei den beiden `command`-Argumenten bei einem einen typischen Fehler den Du beim anderen nicht machst. Schau Dir den Unterschied mal genau an und mach Dir klar wo da der wirklich wichtige Unterschied in der Bedeutung liegt.

Edit: Ganz vergessen: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Dann kann man `fenster` auch nicht mehr auf magische Weise irgendwo einfach so verwenden. Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
gerpark
User
Beiträge: 8
Registriert: Montag 19. Januar 2015, 20:58

Ich bin auch Neuling, zumindest was das Forum betrifft und der geäußerten Kritik und Anregungen schließe ich mich natürlich an.

Es gibt allerdings auch viele Beispiele im Netz, bei denen tkinter Objekte, ich nenne es mal auf der obersten Ebene, also
mit global gültigen Namen verwendet werden. Eine ganz entscheidende Frage ist, wo kann welche
Variable (= Name) verwendet werden. Also der Name E_pfad ist bei Dir innerhalb einer Funktion definiert, er ist nur lokal gültig,
und kann also nur dort verwendet werden. Der Name für den Button button1 dagegen ist ein global gültiger Name, auf den du auch
innerhalb von Funktionen zugreifen könntest. Wenn Du also toplevel mal ganz vergisst und das Eingabe Feld woanders definierst ... :wink:
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@gerpark: es gilt generell, dass man keine globalen Variablen benutzen sollte. Dass button1 schon global ist, ist ein Fehler.
Deshalb muß alles, was eine Funktion braucht, über ihre Parameter übergeben werden.

Code: Alles auswählen

import tkinter as tk 
from functools import partial

def csv_pfad_neu(csv_pfad_eingabe):
    pfad = csv_pfad_eingabe.get()
    print(pfad)
    
def neuesfenster(fenster):
    fenster_2 = tk.Toplevel(fenster)
    tk.Label(fenster_2, text="CSV Pfad:").pack()
    csv_pfad_eingabe = tk.Entry(fenster_2)
    csv_pfad_eingabe.pack()
    tk.Button(fenster_2,text="Übernehmen", command=partial(csv_pfad_neu, csv_pfad_eingabe)).pack()

def main():
    fenster = tk.Tk()
    tk.Button(fenster, text="neues Fenster", command=partial(neuesfenster, fenster)).pack()
    fenster.mainloop()

if __name__ == '__main__':
    main()
Natürlich ist jetzt die Frage, was mit dem `pfad` gemacht werden soll. Wenn der Pfad noch wo anders im Programm benutzt werden soll, kommt man um die Definition einer Klasse nicht drumrum.
Antworten