Variablen aus anderer Funktion verwenden

  • Hi,


    ich habe die Werte AnzPuls, ErgSys & ErgDia aus der Funktion Messung:


    Die Messung wurde also durchgeführt... Und die jeweiligen Werte unter AnzPuls, ErgSys & ErgDia im dafür vorgesehenen Fenster abgelegt.


    Jetzt möchte ich diese Werte unter der Funktion speichern gerne weiter verwenden:


    allerdings bekomme ich als Fehler:


    Quote


    NameError: global name 'AnzPuls' is not defined


    Hat da jemand einen Anstoßer wie ich diese Werte in die Funktion bekomme??
    Oder wie man sie aus dem Fenster liest (kein entry)
    sondern:

    Code
    1. Pulse = Text(master=window, width=3, height=1, font=("Arial",50))

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

  • Hallo Kornfeld,


    kannst Du die betreffenden Variablen global definieren?


    Beste Grüsse


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • sowas überlege ich auch schon.. aber es gelingt mir im Moment nicht..
    ich habe gerade nur gesehen, dass man dies über Einrückung macht...


    Das wäre auf jedenfall ein Lösung.. ich würde fast behaupten die beste... wie definiert man diese global?

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:


  • Das ist aber sehr unschön und schlechter Stil ;).



    Warum returnst du nicht einfach die Werte aus der Messung funktion und übergibst sie als Parameter der Speicher Funktion?



    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Python returnt in diesem Fall ein tuple, welches x Werte enhalten kann, man kann auch alles andere returnen, File-Objects, Listen usw....Ich mag es :)

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Hi,


    danke erstmal für die Antworten! Ich hatte es vorhin mit globalen Variablen realisiert und es hat funktioniert.
    Da ich aber gehört habe das globale Variablen unvorteiulhaft sein können, werde ich es morgen mit dbv seiner Lösung probieren!!


    Die ist wesentlich eleganter.


    MfG

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

  • Hallo zusammen,


    das war ja der Vorteil global deklarierter Bezeichner, dass sie überall im Programm zur Verfügung stehen.


    Das mit dem Zurückgeben ist zwar eine nette Übung - aber bei normalen Anwendungen eher ungewöhnlich.


    Wenn immer Kornfeld diese Variablen in einer anderen Funktion benötigt, muss er diese eine Funktion aufrufen, nur um diese Werte zu erhalten.



    Ich will da jetzt keinen Glaubenskrieg :angel: entfachen - aber es sollte jeder so programmieren, wie er es am besten versteht und nachvollziehen kann. Es gibt meistens mehrere Lösungen, die zum Ziel führen.


    Beste Grüsse


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas ().

  • Quote

    Das mit dem Zurückgeben ist zwar eine nette Übung - aber bei normalen Anwendungen eher ungewöhnlich.


    Ich hab das Gefühl das wird ein Glaubenskrieg. ;). Aber Funktionen haben den Sinn einen Wert zurückzugeben. Deswegen mach man sich Gedanken während man eine Funktion schreibt (Was kommt rein und was kommt raus)


    Quote from http://c2.com/cgi/wiki?GlobalVariablesAreBad


    Really Bad Reasons to Use Global Variables
    .
    "I don't want to pass it around all the time."
    .

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Ich hab das Gefühl das wird ein Glaubenskrieg. ;).


    Das hat meiner Meinung nach wenig mit Glauben zu tun und ist alles andere als ungewöhnlich. Zum einen ist es stilistisch einfach schöner und verständlicher die Rückgabe-Werte zu nutzen, andererseits lässt sich es dann leichter debuggen. :)


    Wenn man aus mehreren Methoden heraus auf einer Variable rumturnt und sie plötzlich unerwartete oder keine Werte enthält, wird es schwierig herauszufinden, welche Funktion dafür verantwortlich ist.

  • ...Wenn man aus mehreren Methoden heraus auf einer Variable rumturnt und sie plötzlich unerwartete oder keine Werte enthält, wird es schwierig herauszufinden, welche Funktion dafür verantwortlich ist.

    Full ACK :thumbs1:


    Kornfeld : In Deinem kleinen Programm ist es wirklich ziemlich unerheblich ob Du globale Variablen benutzt oder Parameter durch Methodencalls schleifst.
    Wenn Du aber größere Programme hast (>1000 Zeilen) ruft das Probleme hervor wie z.B. das von Chris genannte. Globale Variablen haben bewusst eingesetzt ihren Sinn, so wie auch gotos durchaus ihren Sinn haben können (Gibt es in Python allerdings nicht). Braucht man viele globale Variablen ist das normalerweise ein Zeichen, dass man sein Programm schlecht strukturiert oder neudeutsch 'designed' hat. Und um sich gar nicht erst anzugewöhnen bei jeder Gelegenheit der Einfachheit globale Variablen zu benutzen sollte man die auch bei kleinen Programmen soweit wie möglich vermeiden.


    @ds: Auch bei C kann man Pointer auf structs, die den Tulpen in Python in etwa entsprechen, zurückgeben. Eine weitere Abstraktion sind dann z.B. Klassen in C++ und Python als Rückgabewerte.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Torvalds, 28.9.2003

    >>> raspiBackup: Sichere Deine Raspberry regelmäßig im laufenden Betrieb <<<

    Pi 2B (Cups, Pilight), Pi 2B (NFS Server, rsync Server, OpenVPN Server), Pi 3B (Seafile)

    Edited once, last by framp ().

  • Moinsen ...


    Full ACK :thumbs1:


    Tjaaa .... ich habe ( das ist allerdings schon das eine oder andere Jahrzehnt her ;) ...) eingeimpft bekommen: Keine globalen Variablen. Es gibt (fast) immer eine Alternative!
    Das war so ein Leitsatz, u.a. deshalb, weil es neben den von Chris genannten Problemen (richtig lustig ist das dann bei multi-threading) auch noch die Problematik mit dem scope gibt. Hast Du eine lokale Variable in einer Funktion mit demselben Namen wie die globale (ja ... das geht - warum auch nicht) - nur: welche wird jetzt verwendet :s ... Ok, ist zwar geregelt aber trotzdem eine üble Falle.
    Soviel mal zum Thema globale Variablen in C.
    Selbiges galt bei uns für goto ... es gibt in C (fast) immer einen anderen Weg.
    Das hat sich einfach so festgesetzt und wenn ich mal so überlege, wieviele Millionen Codezeilen ich in C mittlerweile geschrieben aber auch gelesen habe - beides kam in Summe so oft vor, dass ich es an einer Hand abzählen könnte.
    Wenn man das Ganze jetzt auf Maschinencode-Ebene betrachtet, sieht die Sache dann wieder ganz anders aus ... aber das ist nicht das Thema.
    Ok ... nun haben wir uns ausgelassen ausgelassen, da wollen wir mal aufpassen, dass das Thema nicht auch noch ausgelassen wird ....


    ....
    @ds: Auch bei C kann man Pointer auf structs, die den Tulpen in Python in etwa entsprechen, zurückgeben. Eine weitere Abstraktion sind dann z.B. Klassen in C++ und Python als Rückgabewerte.
    ...


    Manno ... Spielverderber ... ;)


    cheers,
    -ds-

  • ...Manno ... Spielverderber ... ;)

    Du kennst mich doch :-) Aber ich denke nun ist gut mit <OT>

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Torvalds, 28.9.2003

    >>> raspiBackup: Sichere Deine Raspberry regelmäßig im laufenden Betrieb <<<

    Pi 2B (Cups, Pilight), Pi 2B (NFS Server, rsync Server, OpenVPN Server), Pi 3B (Seafile)

  • ...ich hab jetzt mal nicht alles gelesen.... das schoma vorab :fies:



    Ich sehe kein Problem darin manche Sachen als global zu definieren, insbesondere dann wenn man aus einer Ausweisung nicht eine andere aufrufen kann da das sammeln der Daten noch nicht fertig ist.


    Aber das sollte man wirklich nur als aller letzte Möglichkeit betrachten.


    Besser und übersichtlicher sowie Modular-Sicherer ist es wirklich die Variablen als return zurück zu geben und zum Beispiel wie folgt weiter zu verarbeiten:


    Code
    1. def collectData():
    2. startkind = Skstartkind.get()
    3. starterw = Skstarterw.get()
    4. return (startkind, starterw)
    5. def useData():
    6. values = collectData()



    Siehe dazu auch: http://stackoverflow.com/quest…multiple-values-in-python

  • Sehe ich auch so. In Maßen ist alles OK. Ist übrigends ein interessanter Link. Allerdings würde ich bei mehr als 5 Parametern kein Dictionary returnen sondern eine Klasse. Ansonsten verliert man den Überblick welcher Parameter an welcher Stelle in der Tulpe steht.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Torvalds, 28.9.2003

    >>> raspiBackup: Sichere Deine Raspberry regelmäßig im laufenden Betrieb <<<

    Pi 2B (Cups, Pilight), Pi 2B (NFS Server, rsync Server, OpenVPN Server), Pi 3B (Seafile)

    Edited once, last by framp ().

  • ich kämpfe momentan auch mit Variablen zurückgeben. Schön, dass das hier so wie beschrieben funktioniert um Werte aus einer Funktion in einer anderen Funktion zu nutzen.


    Das liest sich für mich aber so, als gäbe es noch einen schöneren/besseren Weg!? Was wäre denn noch eine Lösung für das Problem?

  • mischtkrabb : das sind absolute Grundlagen. Wenn du damit kämpfst -> Tutorial auf docs.python.org durcharbeiten.


    Gruß, noisefloor

    ich weiß, ich bin da aber schon ziemliche lange am googeln und hab mir auch ein buch gekauft. irgendwie bin ich wohl zu doof ;-)


    in den ganzen Tutorials und docs wird das jeweils nur für eine Funktion betrachtet. ich habe noch nichts gefunden, wo beschrieben ist wie man Variablen aus einer Funktion in einer anderen Funktion nutzt...


    Andreas erwähnt oben mehrere Wege... Wäre mal sehr hilfreich wenn ich eine Seite finden würde, in der die mehreren Wege beschrieben und verglichen werden. Bei mir ist da viel ausprobieren und dabei lernen ... irgendwann komm ich schon dahinter wie das funkt.


    So wie ich das bisher kapiert und verstanden habe, ist wohl Beispiel 1 oder Beispiel 3 am besten. Das versteh ich und ist nachvollziehbar wenn ich aus Funktionen Variablen im main Code verwenden will. Beispiel 4 versteh ich auch noch, wie ich Werte der Funktion aus Beispiel 1 in der Funktion Beispiel 4 wieder verwende.


    Gibts denn noch mehrere Möglichkeiten sowas zu machen? Oder ist das alles?