tkinter, Datei öffnen und global Variable vermeiden

Fragen zu Tkinter.
Antworten
EFFiZ
User
Beiträge: 6
Registriert: Mittwoch 12. Februar 2020, 10:08

Liebes Forum,

ich habe ein kleines Programm geschrieben, es funktioniert. Aber weil ich als Programmiereinsteiger auf der Suche nach Rat in diversen Foren lese, dass globale Variablen zu vermeiden sind, wende ich mich an Euch.

Weil das Problem nur auftritt, weil ich ein GUI mit tkinter haben wollte, steht es hier.

Ich habe einen tk.Button:

Code: Alles auswählen

b_open = tk.Button(frame2, text = "Daten öffnen", command = open_file)
b_open.pack(padx = 5, pady = 5)
Dieser Button greift auf folgende Funktion zu, die eine Datei öffnet und einen Data Frame erzeugt:

Code: Alles auswählen

def open_file():
    global df
    
    # Öffnen der csv-Datei
    name = askopenfilename(filetypes = [("csv files","*.csv"), ("All files","*.*")], 
                                        initialdir = "F:/Python/Projekt/DataSets", 
                                        title = "Select File:")
    
    # Dataframe aus Daten    
    df = pd.read_csv(name, sep = ";")
Jetzt habe ich einen zweiten Button, der eine Funktion aufruft, die eine Funktion aufruft, die ... usw.

Code: Alles auswählen

b_zweid = tk.Button(frame2, text = "2D-Plot", command = zweid)
b_zweid.pack(padx = 5, pady = 5)
Am Ende dieser Abfolge von Funktionen war ursprünglich ein Zugriff auf die Funktion open_file(), um an den Data Frame zu gelangen.
Problem: Es wird dann natürlich wieder askopenfilename() ausgeführt, obwohl die Daten schon geladen sind.

Ich konnte mir nur mit der einer globalen Variable df und einer eingeschobenen Funktion helfen, auf die letztendlich der zweite Button zugreift:

Code: Alles auswählen

def openfile():
    return df
Wie muss ich die Funktion open_file() umschreiben, damit ich auf den Data Frame zugreifen kann, ohne askopenfilename() nochmals auszuführen oder wie übergebe ich df ohne eine globale Variable zu nutzen?

Ich bin eher für eine kurz "schmutzige" Lösung zu haben. Sicherlich wäre eine Lösung Klassen zu nutzen, aber da bin ich noch nicht so firm.

Ich hoffe, die Skriptausschnitte verdeutlichen das Problem und ermöglichen einen Ratschlag.

Vielen Dank im Voraus!
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Für jedes nicht-triviale GUI-Programm braucht man Klassendefinitionen um sich Sachen über den Aufruf eines Callbacks hinaus merken zu können.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo EFFiZ,
1.

Code: Alles auswählen

from functools import partial
2.
mit: command = partial(funktionsname, argument1, argumnent2....)
Gruss
Peter
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

@peterpy: partial hilft aber nichts, wenn man einen "Rückgabewert" hat.
Antworten