File öffnen im Filedialog und mit Daten weiterarbeiten

Fragen zu Tkinter.
Antworten
neuron
User
Beiträge: 5
Registriert: Dienstag 4. April 2017, 18:54

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
Zuletzt geändert von Anonymous am Dienstag 25. April 2017, 08:40, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
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.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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
BlackJack

Und da wäre schon wieder ``global``…

@neuron: Vergiss das es ``global`` gibt. Das ist keine Lösung sondern ein Problem.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten