Programm bleibt beim Durchlauf stehen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Schönen Tag liebe Leser

    und zwar habe ich folgendes Problem:

    Ich habe mir letztens ein PiFacedigital 2 zugelegt und darauf ein Programm geschrieben. Leider bleibt das Programm ab einem gewissen Punkt einfach "stehen".
    Vorher hatte ich das Programm auf dem GPIO layout geschrieben dort hat es funktioniert. Aber da das PiFace durch SPI gesteuert wird musste ich das Programm leicht umändern.


    Das Programm ist ein Zähler.
    Die Sollzahl kann man durch 2 Buttons im Label bestimmen und durch einen 3ten Button bestätigen.
    Wenn man auf "Start" drückt zählt das programm die IST zahl hoch(durch einen Sensor) ist die IST Zahl gleich der SOLL Zahl hört das Zählen auf.
    Durch einen Taster kann man dann die IST Zahl zurücksetzen und es fängt von vorne an.

    Hier liegt auch das Problem wenn die IST Zahl gleich der SOLL Zahl ist und ich den Zähler Rücksetzen möchte funktioniert dies nicht (Das Programm bleibt stehen).

    Hier mein Programm:

    Ich bin erst seit 3 Wochen am Python Programmieren und habe deswegen nicht die Ehrfahrung


    PS: Sorry für die Rechtschreibfehler und die unsaubere Programmierung :D

    Einmal editiert, zuletzt von saritius (25. April 2016 um 20:03)

  • [code=php]
    global A
    global B
    global C
    global D
    global E
    A=0
    B=0
    C=0
    D=0
    E=0
    [/php]

    Das macht kein Sinn. Zum einen sind die Variablen automatisch global also in allen Funktionen verfügbar, zum anderen muss man in Funktionen selbst "global" anwenden sofern man diese verändert und außerhalb der Funktion abrufen will.

    Das nächste was daraus aber auch resultiert ist: Tu dir selbst und uns ein Gefallen und benenne die Variablen entsprechend ihrer Funktion. In der Form steigst nämlich nur Du da durch, ich versteh nur Bahnhof weil ich nicht verstehe was A B C D E, label1 label2 usw zu bedeuten haben

    Und zu guter letzt sei gesagt das man nicht das Module _thread verwendet. Wie der Name mit dem _ am Anfang eigentlich verrät ist das kein Module für den normalen Gebrauch. Man sollte stattdessen "threading" nutzen. Du hast da eh noch ein Problem sofern man mehrmals auf "Start" klickt.. Aber ich glaub auch das diese Start() Funktion gänzlich überflüssig sein kann sofern man das Zählen in den anderen Funktionen abhandelt.

  • Hey,

    ich bin mir nicht sicher aber versuch mal an der Stelle:

    Code
    if pfc.input_pins[0].value > 0:                                       <-- Hier tritt der Fehler ein
    
    
                           C=0

    Lieber:

    Code
    if pfc.input_pins[0].value > 0:                                       <-- Hier tritt der Fehler ein
                          global C
                           C=0

    Vielleicht hilft es was....


    Beste Grüße

  • ...Nein... C ist bereits oben für die Funktion "global" gesetzt.


    Wenn ich diese übermäßige Verwendung von "global" sehe wird mir btw schlecht :(

    Besser wäre es dem "command" die zu verändernde Variable zu übergeben, da die ja bereits global ist, weil sie ausserhalb einer Funktion deklariert wurde...

    Oder man verwendet "Tkinter variables" http://www.python-kurs.eu/tkinter_variablen_klassen.php

  • Schonmal vielen Dank für die Antworten

    habe das Programm überarbeitet und hoffe es ist jetzt etwas verständlicher für euch.
    Außerdem hattest du auch recht mit dem mehrmals auf "Start" drücken.
    Die variable wird dann so oft wie man "Start" drückt gezählt
    sprich bei 3x auf "Start" drücken zählt die variable 3,6,9...
    aber dieser Fehler ist erstmal "unwichtiger" xD.

    meigrafd
    Das du den Fehler schon anhand des Codes so schnell erkennst. Respekt!
    Hast du das so gemeint mit dem Threading?


    Hoffe auf weitere Antworten :)


  • Fangen wir erst mal klein an, wobei ich nicht alles erkläre es gibt genug Anleitungen im Netz..

    Ein einfaches Programm um etwas hoch zu zählen sobald der Button gedrückt wird: http://codepad.org/3ddPwAHZ
    Mehr ist dafür nicht nötig, kein einziges explizites setzen von "global".

    Versuch das erst mal zu verstehen, dann erklär ich den nächsten Schritt ;)


    => http://www.python-kurs.eu/tkinter_variablen_klassen.php
    => http://infohost.nmt.edu/tcc/help/pubs/…-variables.html


    //EDIT: Weitere Beispiele:
    Tkinter mainloop unterbrechen
    Tkinter Label per after() aktualisieren

  • Gut ;)

    Dann kombinieren wir nun das was bootsmann erwähnt hat zum auslesen des Sensors - wobei ich jetzt nur so tue als ob da ich deinen Sensor nicht habe - und binden auch die restlichen Buttons ein.

    Wie du vielleicht schon bemerkt hast, nutze ich einen anderen Layout-Manager wie du es hattest. Du hast "pack" verwendet, ein sehr weit verbreiteter aber wie ich finde eher ungenauer und unflexbler Layout-Manager. Es gibt noch "place" und "grid" wobei ich letzteres verwende, "place" ist komplizierter aber zugleich am besten.

    Desweiteren kann man nur "Start" drücken wenn zuvor "Bestätigen" gedrückt wurde. Sobald "Istwert" den Wert von "Soll" erreicht hat, wird der Sensor nicht weiter ausgelesen und "Istwert" auf 0 zurückgesetzt. Erst nachdem man wieder "Bestätigen" gedrückt hat gehts weiter...

    => http://slexy.org/view/s2YQf2UDDT

  • Vielen vielen Dank für die Antworten und die großartige Hilfe

    meigrafd dein Programm ist deutlich kleiner als meins und macht das gleiche :D
    nun jetzt habe ich das nächste Problem :( :wallbash:
    wenn ich meinen Taster einbinde sendet dieser vom PiFace immer eine 1 oder garnix.
    Ich habe es schon mit verschiedenen Befehlen probiert
    z.B
    listener = pf.InputEventListener(chip = pfc)
    listener.register(0, pf.IODIR_FALLING_EDGE, read_sensor_data(istwert_label))
    listener.activate()

    ich hoffe ihr Profis könnt mir nochmal bei meinem dummen Problem helfen


    Automatisch zusammengefügt:
    Ich glaube das Problem liegt daran, wenn das Programm abläuft wartet es nicht auf ein 1 signal am Eingang 0 sonder läuft einfach durch. Bei dem GPIO layout gibt es den befehl ....wait_for....
    aber soweit ich weiß gibt es den nicht bei dem PiFace deswegen müsste ich eine while schleife einfügen.
    Aber wenn ich das tue, bleibt doch das Fenster stehen weil das programm in der While schleife festhängt?
    hmm mal ausprobieren

    Einmal editiert, zuletzt von saritius (29. April 2016 um 10:40)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!