globale variable zählt nur beim ersten Programmdurchlauf richtig

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Hallo,

ich habe ein verrücktes Problem mit einem Programm, das globale Variablen nutzt. Eins vorweg: Bitte jetzt keinen Shitstorm oder Ähnliches. Ich weiß, dass man das eigentlich nicht macht. Aber trotzdem hätte ich das gerne so zu Ende gemacht, weil ich den inzwischen 8-seitigen Code nicht aufgeben möchte.

Also, ich habe eine Maske, wo Mitarbeiter aus einer Datei geladen wurden. Also die sind schon ausgewählt. In der Maske kann man dann Monat und Krankheitstage pro Monat eingeben. Wenn man in der Maske auf den Button "Weiter" klickt, kommt der nächste Mitarbeiter etc... Wenn alle ausgewählten Arbeiter, die zuvor in der Liste "Treffer" gespeichert wurden, durchgelaufen sind, erscheint als Ausgabe "fertig". Das klappt auch wunderbar, aber wenn man das ein zweites, drittes Mal durchführt, zählt der globale trefferzähler nicht mehr richtig. Beim ersten Klick auf weiter wird er dann um 2 erhöht anstatt um eins, beim dritten mal um 2. Ich bin jedenfalls völlig ratlos und hoffe, dass meine Erklärungen einigermaßen verständlich waren (ich sitz grad da und mir brummt der Schädel).

Hier mal der betreffende Code:

Code: Alles auswählen

def KrankentageEingeben():
    global trefferzähler
    trefferzähler = 0
    kursladen.tableWidget.clear()
    eingabe.comboBoxTage.clear()
    eingabe.show()
    eingabe.comboBoxTage.addItems(["1","2","3","4","5","mehr als 5"])
    eingabe.labelName.setText(Treffer[trefferzähler].name + ", " + Treffer[trefferzähler].vorname)
    
    
    eingabe.ButtonWeiter.clicked.connect(ButtonWeiter)
    

def ButtonWeiter():
    global trefferzähler
    print (trefferzähler)
   
    var = len(Treffer)-1
    if trefferzähler >= var:
        print ("fertig")
        Treffer[trefferzähler].tragetageiniiste ein(eingabe.lineEditMonat.text(), eingabe.comboBoxTage.currentText())
        
        
        
       
        Dateilöschen()
        for zähler in range(0, len(ensemble)):
            ensemble[zähler].BearbeiteteDatenSpeichern
            
        trefferzähler = 0
        
        eingabe.lineEditMonat.clear()
        eingabe.close()
        kursladen1()
        else:
        Treffer[trefferzähler].tragetageinlisteein(eingabe.lineEditMonat.text(), eingabe.comboBoxTage.currentText())

        
        

 
        trefferzähler = trefferzähler +1
    
        eingabe.labelName.setText(Treffer[trefferzähler].name +", " +Treffer[trefferzähler].vorname)
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Hat niemand eine Idee? :(
Es gibt aus meiner Sicht keinen Grund, warum er das macht. Ich bin auch am Verzweifeln. Aber vielleicht kennt einer der Experten hier dieses Phänomen.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Entschuldige meine Offenheit, aber mir ist dein Code zu krude, um mich damit zu beschäftigen.

Schau dir mal die Funktion KrankentageEingeben an.
Sie bekommt keine Parameter.
Du definierst "trefferzähler" als global (warum nicht als Parameter übergeben?!?)
Du setzt trefferzähler auf 0.
Du veränderst in der Funktion trefferzähler nicht mehr, benutzt es aber als Index. Und der ist halt immer 0. Wenn dem nicht so ist, veränderst du irgendwo außerhalb trefferzähler (und das ist Kacke und _niemand_ will das debuggen) oder du zeigst uns nicht den richtigen Code.

"Treffer" ist auch so eine magisch auftauchende Variable.

So ist es recht mühselig dir zu helfen.

Schreib das Programm strukturiert neu - dann erledigt sich auch dein Problem direkt.

Und das mit den 8 Seiten ist dann auch nicht mehr, wenn du weniger unsinnige Leerzeichen setzt.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

sparrow spricht mir aus der Seele, zwar gibt es noch morgen als Feiertag zum Wochenende dazu, aber wenn sich das oben gezeigte Drama über 8-Seiten fortsetzt (Was für Seiten eigentlich? Man gibt für die Länge von Source-Code die Zeilenanzahl an...) wird mir anders. Es entgegen aller Meinung doch falsch zu machen und global zu verwenden, sich dann auch noch über genau dieses "merkwürdige" Verhalten zu wundern, ist dann zusätzlich schräg.

Bitte einfach mal den ganzen Code zeigen. Und keine Angst, den wird sicherlich keiner hier verwenden um damit dann Geld zu verdienen.
When we say computer, we mean the electronic computer.
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Der Code ist schon der richtige. Treffer enthält die gefundenen Elemente, die zuvor aus der Datei geladen wurden. wie kann ich denn den Trefferzähler (den ich ja funktionsübergreifend brauche) als Parameter übergeben? Nochmal: Beim ersten Programmdurchlauf läuft das alles wie gedacht, aber dann, wenn ich das zweite mal Krankheitstage eingebe wird beim klick auf weiter 2 auf einmal gezählt, beim 3. mal 3 auf einmal usw. Das heißt, ich muss jedes Mal das Programm beenden und wieder starten, damit das wieder geht. An der Variable kann es glaube ich nicht liegen; mittlerweile habe ich die sogar am Ende der Funktion gelöscht oder mehrfach auf 0 zurück gesetzt, aber jedesmal der gleiche Sch... Es ist zum Blöde werden.
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Cortez: Wenn das der Code ist mit dem Du ein Problem hast, dann wäre das aber ein anderes, nämlich mindestens zwei Syntaxfehler. In `ButtonWeiter()` die zweite Zeile im ``if``-Block und etwas später dann noch ein falsch eingerücktes ``else``.

Dann gibt's lauter globale Variablen. Und nun hast Du Probleme nachzuvollziehen was da von wo (nicht) verändert wird – also genau die Probleme derentwegen man keine globalen Variablen verwenden sollte. Aber Du willst eine andere Lösung hören als die globalen Variablen loszuwerden – und damit dieses Problem.

Bereits vorhandene Programmlänge ist da auch nicht wirklich eine gute Begründung für, denn je länger man wartet den Code sauber zu schreiben, um so mehr ”technologische Schulden” häufen sich auf, und es macht noch mehr Arbeit aufzuräumen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten