Seite 1 von 1

globale / locale Variable

Verfasst: Montag 27. Mai 2019, 06:10
von wolsue
# 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

Re: globale / locale Variable

Verfasst: Montag 27. Mai 2019, 06:17
von ThomasL
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.

Re: globale / locale Variable

Verfasst: Montag 27. Mai 2019, 06:53
von Sirius3
@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?

Re: globale / locale Variable

Verfasst: Montag 27. Mai 2019, 08:23
von wolsue
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

Re: globale / locale Variable

Verfasst: Montag 27. Mai 2019, 09:10
von Sirius3
@wolsue: und warum arbeitest Du da mit pynput?

Re: globale / locale Variable

Verfasst: Montag 27. Mai 2019, 16:58
von wolsue
@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.

Re: globale / locale Variable

Verfasst: Montag 27. Mai 2019, 17:24
von __deets__
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.

Re: globale / locale Variable

Verfasst: Donnerstag 6. Juni 2019, 12:38
von DeaD_EyE
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.