globale / locale Variable

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
wolsue
User
Beiträge: 6
Registriert: Samstag 31. März 2018, 21:20

# pynput muss zur verfügung stehen
# peil nach oben beginnt
# peil nach unten nächste
# ESC Taste beendet Prg
#
# ich kann den counter nicht von einer anderen Function nicht auf null stellen.



from pynput import keyboard

last_key_press = ""
counter = 0

def erster():
global counter
counter = counter + 1
print("counter erster "+str(counter))

def on_press(key):
print('Key {} pressed.'.format(key))
global last_key_press
key_press = key

if last_key_press != key_press:
print("zurück setzen " )
C_links = 0
print("C_links "+str(C_links))

if key == keyboard.Key.up :
print("Up")
last_key_press = key
erster()
erster()

if key == keyboard.Key.down :
print("Down")
last_key_press = key
erster()
erster()

if key == keyboard.Key.esc :
print("Abruch / Ende")
last_key_press = key
return False


def on_release(key):
print('{0} released'.format(key))
print(keyboard.Key)
if key == keyboard.Key.esc:
return False

try:
with keyboard.Listener(
on_press = on_press,
on_release = on_release) as listener:
listener.join()

except KeyboardInterrupt:
print("\n Ende")

except:
print ("\n Oher error or exception occured")

wie ist es möglich die Variable counter in der def erster von der def on_keypress auf nul lzu setzen.
Meine Versuche sind alle Erfolg los. Bin aber auch für anderen Vorschlag dankbar.
bitte auch den Anfang des Prg lesen. Danke
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hallo wolsue,
dein Code ist ohne Einrückung nicht zu lesen.
Bitte benutze im vollständigen Editor den Button </> und füge deinen Code dann zwischen
[ code] und [ /code] ein.
"global" ist nicht gerne gesehen in Python, das kann man auch ohne lösen.
Dafür kann man Funktionen Argumente übergeben und Funktionen können Rückgabewerte
an den aufrufenden Code zurück liefern.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@wolsue: Programmieren braucht eine gewisse Sorgfalt. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 2, 3, 4 oder 5 oder gar 7. For : kommen keine Leerzeichen.
Das nakte Except am Schluß verhindert, dass Du irgendeinen Programmierfehler finden kannst, weil alles durch ein "Oher error occured" platt gemacht wird.

Du kannst counter um 1 erhöhen. Wie hast Du versucht counter auf 0 zu setzen?

Was willst Du eigentlich machen?
wolsue
User
Beiträge: 6
Registriert: Samstag 31. März 2018, 21:20

Die Sorgfalt ist mir bekannt. Nur mit copy/paste wird diese Sorgfalt ignoriert. Leider kann ich dies im nach herein nicht berichtigen.
@Sirius3 was ich machen will:
Ein Zähler eines Sensor wird um 1 erhöht wenn True erfüllt ist. Dieser Zähler muss aber bei bestimmten Tasten zurück gesetzt werden.
versuch hab ich:
am Anfang counter als global definiert also ausserhalb aller Functionen
erzeugt fehler --> local variable ' counter' referenced before assigmment
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@wolsue: und warum arbeitest Du da mit pynput?
wolsue
User
Beiträge: 6
Registriert: Samstag 31. März 2018, 21:20

@Sirius3 st das wichtig für mein Problem ? Ich will nicht unhöflich sein, aber nur mit Fragen beantwortet man keine Fragen.

pynput enthält keyboard input bzw. handling keyboard.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da ich deine echten Code immer noch nicht sehen kann, kann ich nur raten: du hast versucht, global vor die Variablen auf Modul Ebene zu schreiben. Das geht, bringt aber nichts. Richtig(*) geht es so:

Code: Alles auswählen

>>> global foo # akzeptiert der Interpreter, ist aber Unsinn. Global weglassen!,!
>>> foo = 10
>>> def a():
...     foo += 1
...     
>>> def b():
...     global foo
...     foo += 1
...     
>>> a()
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "<string>", line 2, in a
UnboundLocalError: local variable 'foo' referenced before assignment
>>> b()
>>> foo
11
*mit globalen Variablen zu arbeiten ist ein Entwurfsfehler, der sich üblicherweise später rächt. Aber da das kaum wen aus dem PI-Lager interessiert, hast du jetzt all das Seil, um dich selbst zu erhängen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1236
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Das gleiche als Klasse ohne die Nutzung von globale Namen (Variablen).

Code: Alles auswählen

class Foo:
    def __init__(self):
        self._a = 0
        self._b = 0
    def a(self):
        self._a += 1
        return self._a
    def b(self):
        self._b += 1
        return self._b

foo = Foo()
foo.a()
foo.b()
Aber ja, wird eh ignoriert. Funktionen werden auch nicht so oft eingesetzt.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten