Python Widt und while statement gleichzeitig benutzen

_Phoenix_

Cadet 3rd Year
Registriert
Juni 2020
Beiträge
38
Hallo zusammen, ich bin Python Anfänger und habe folgendes Problem: Ich habe ein with Statement,

Python:
with keyboard.Listener(on_press=log, on_release=release) as listener:

listener.join()

Und dazu will ich noch eine while schleife laufen lassen, die unabhängig vom with Statement funktionieren soll. Aber egal wie ich mache es wird immer nur das eine ausgeführt. Das heisst wenn ich zuerst das with Statement schreibe wird nur das ausgeführt und sonst nur die while schleife, ich habe es auch schon per multithreading versucht doch auch das hat nicht funktioniert, übersehe ich etwas Simples, oder bin ich Komplet auf dem Holzweg?
 
die problembeschreibung ist ja schon recht dürftig... ich vermute es geht um pynput? mal kurz aus der doku gebastelt funktioniert es doch?

Python:
from pynput.keyboard import Key, Listener
import time

def on_press(key):
    print('{0} pressed'.format(key))

def on_release(key):
    print('{0} release'.format(key))
    if key == Key.esc:
        # Stop listener
        return False

with Listener(on_press=on_press, on_release=on_release) as l:
    while True:
        print("bla")
        time.sleep(1)
    l.join()

ergibt ein regelmässiges "bla" und dazu die prints für on_press und on_release:

Code:
$ python -u bla.py
bla
bla
bla
s's' pressed
's' release
bla
bla
d'd' pressed
'd' release
bla
bla
e'e' pressed
'e' release
bla
Key.ctrl_l pressed
'\x03' pressed
 
  • Gefällt mir
Reaktionen: BeBur
Also erstmal vielen dank an @0x8100 ich hatte es so probiert dass ich unterem with noch eine while schleife erstellt habe, deine Lösung ist aber natürlich die bessere/richtige. Ich hätte noch eine Frage wenn ich es wie in deiner Lösung mache, dann zeigt mir Pycharm an dass "listener.join" nicht erreicht wird, und trotzdem funktioniert es, also was macht "listener.join"?
 
_Phoenix_ schrieb:
Also erstmal vielen dank an @0x8100 ich hatte es so probiert dass ich unterem with noch eine while schleife erstellt habe, deine Lösung ist aber natürlich die bessere/richtige.

bei erst with und dann while bleibst du solange im with, bis die abbruchbedingung des listener-threads erfüllt wurde, erst dann würde es mit dem while weitergehen. eine parallele ausführung ist so nicht möglich. man könnte aber auch sowas machen:

Python:
from pynput.keyboard import Key, Listener
import time

def on_press(key):
    print('{0} pressed'.format(key))

def on_release(key):
    print('{0} release'.format(key))
    if key == Key.esc:
        # Stop listener
        return False

l = Listener(on_press=on_press, on_release=on_release):
l.start()

while True:  # oder bessere abbruchbedingung
    print("bla")
    time.sleep(1)

l.join()

_Phoenix_ schrieb:
Ich hätte noch eine Frage wenn ich es wie in deiner Lösung mache, dann zeigt mir Pycharm an dass "listener.join" nicht erreicht wird, und trotzdem funktioniert es, also was macht "listener.join"?

ehrlich gesagt, habe ich mich das auch gefragt - ich habe das nur so aus dem beispiel der doku übernommen. das .join() macht man, wenn man auf das ende eines threads/prozesses wartet. es macht sinn, das .join() aufzurufen, wenn man einen thread/prozess selbst per .start() gestartet hat.

hier wird es aber auch im beispiel innerhalb eines context-managers (with foo as bar) benutzt. normalerweise würde man erwarten, dass der context-manager sich um das stoppen des threads kümmert.

habe ich ich jetzt aber nicht weiter probiert, ob es auch ohne geht - so gross war mein interesse daran dann nicht mehr :)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: _Phoenix_
Zurück
Oben