Seite 1 von 1

File öffnen im Filedialog und mit Daten weiterarbeiten

Verfasst: Dienstag 25. April 2017, 08:12
von neuron

Code: Alles auswählen

from Tkinter import * 

from tkFileDialog import askopenfilename
from numpy import *

def callback():
    name = askopenfilename()
    #print name
    if name:
        data = loadtxt(name)
        print data
    return data
errmsg = "Error!"

Button(text = "File open", command = callback).pack(fill = X)

d_mean = mean(data,1)
mainloop()
Hi zusammen
Ich arbeite gerade an einem Skript zur statistischen Datenauswertung.
Ich würde die file gerne im Filedialog öffnen; mir die Daten dann in einem array abspeichern und zurückgeben lassen.
Allerdings bekomme ich den Fehler, dass er die variabloe data nicht finden kann. Ich möchte aber nicht die geamte Auswertung in der Funktion callback machen. Wäre cool ihr mir da weiterhelfenn könntet

Re: File öffnen im Filedialog und mit Daten weiterarbeiten

Verfasst: Dienstag 25. April 2017, 09:07
von BlackJack
@neuron: Du machst es Dir mit der GUI-Programmierung sehr, also im Grunde zu einfach. GUI-Programmierung funktioniert vom Programmablauf nicht mehr so linear das Du als Programmierer die Ablaufreihenfolge direkt bestimmst. Die Berechnung muss von der Rückruffunktion durchgeführt beziehungsweise von dort dann aufgerufen werden. Das Ergebnis kann aber nicht an den Aufrufer zurückgegeben werden, denn der Aufrufer ist die GUI-Hauptschleife und die erwartet keine Rückgabewerte. Die wüsste damit auch gar nichts anzufangen. Also brauchst Du Zustand über ”Funktionsaufrufe” hinweg. Das macht man mit objektorientierter Programmierung (OOP).

Weitere Anmerkungen: Gewöhn Dir am besten *sofort* die Sternchenimporte ab. Damit holst Du alle Namen aus einem Modul in den Namensraum des importierenden Moduls. Das sind gerade bei Tkinter als auch Numpy sehr viele. Man weiss dann nicht mehr was eigentlich wo definiert wurde und es besteht die Gefahr von Namenskollisionen.

Re: File öffnen im Filedialog und mit Daten weiterarbeiten

Verfasst: Dienstag 25. April 2017, 10:24
von Alfons Mittelmeyer
neuron hat geschrieben:Ich würde die file gerne im Filedialog öffnen; mir die Daten dann in einem array abspeichern und zurückgeben lassen
Das zurückgeben geht nicht, weil Du die Callbackfunktion nicht aufrufst. Tkinter ruft diese Funktion innerhalb der mainloop() Funktion auf. Was nützt es Dir, wenn Tkinter dann einen Returnwert erhält?
neuron hat geschrieben:Allerdings bekomme ich den Fehler, dass er die variabloe data nicht finden kann.
neuron hat geschrieben: Ist klar, Du definiert eine Callbackfunktion und willst dann data ausgeben. data ist aber nach Definition der Callbackfunktion nicht bekannt. Der Aufruf der Callbackfunktion erfolgt erst ganz zum Schluss innerhalb von mainloop(). Außerdem wäre es eine lokale variable.
Was möchtest Du tun?

Das:

Code: Alles auswählen

from Tkinter import *
 
from tkFileDialog import askopenfilename
from numpy import *
 
def verarbeite_data(name):
    data = loadtxt(name)
    print data
    d_mean = mean(data,1)
    print d_mean

def callback():
    name = askopenfilename()
    #print name
    if name:
        verarbeite_data(name)

errmsg = "Error!"
Button(text = "File open", command = callback).pack(fill = X)
 
mainloop()
Oder meinst Du, dass man nach Beendigung der Gui die Daten auswertet?

Code: Alles auswählen

from Tkinter import *
 
from tkFileDialog import askopenfilename
from numpy import *
 
def callback():
    name = askopenfilename()
    global data
    #print name
    if name:
        data = loadtxt(name)
        root.destroy()


button = Button(text = "File open", command = callback)
button.pack(fill = X)
root = button.winfo_toplevel()

mainloop()

print data
d_mean = mean(data,1)
print d_mean

Re: File öffnen im Filedialog und mit Daten weiterarbeiten

Verfasst: Dienstag 25. April 2017, 10:27
von BlackJack
Und da wäre schon wieder ``global``…

@neuron: Vergiss das es ``global`` gibt. Das ist keine Lösung sondern ein Problem.

Re: File öffnen im Filedialog und mit Daten weiterarbeiten

Verfasst: Dienstag 25. April 2017, 11:46
von Sirius3
@neuron: Du schreibst, Du möchtest nicht die gesamte Auswertung in der callback-Funktion machen. Das mußt Du auch nicht, aber was Du tun mußt, ist, die Auswertung in einer oder mehreren Funktionen zu machen. Wenn Du anfängst auf oberster Ebene ausführbaren Code zu schreiben, endet das in nicht wartbarem Spaghetti-Code. Jede Funktion bekommt dabei eine Aufgabe, es wäre als auch falsch, alles in callback zu schreiben.

Das Grundgerüst konnt also so aussehen:

Code: Alles auswählen

import Tkinter as tk
from tkFileDialog import askopenfilename
import numpy as np

def evaluate(data):
    print data.mean(axis=1)

def callback():
    name = askopenfilename()
    #print name
    if name:
        data = np.loadtxt(name)
        evaluate(data)
    
def main():
    root = tk.Tk()
    tk.Button(root, text="File open", command=callback).pack(fill=tk.X)
    root.mainloop()

if __name__ == '__main__':
    main()
Wenn Du aber noch mehr in Deine GUI hineinpacken willst, wirst Du mit dem Ansatz, der rein auf Funktionen basiert, an Grenzen stoßen. Dann ist es Zeit, Funktionalität in Klassen zu bündeln.