0
votes

Python: imprimer une seule fois dans un While

J'ai utilisé le temps pour attraper une impression et maintenant je cherche un moyen de juste 1 imprimer sans interrompre mon temps:

Keyboard connected
Keyboard connected
Keyboard connected
Keyboard connected
Keyboard connected
Keyboard connected
Keyboard connected
Keyboard connected
Keyboard connected
Keyboard connected
Keyboard connected
Keyboard connected

mais ce que j'obtiens dans la sortie est ceci:

import wmi
import time


device_connected_wql = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA \'Win32_Keyboard\'"
device_disconnected_wql = "SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA \'Win32_Keyboard\'"

c = wmi.WMI()
connected_watcher = c.watch_for(raw_wql=device_connected_wql)
disconnected_watcher = c.watch_for(raw_wql=device_disconnected_wql)

while 1:
    try:
        connected = connected_watcher(timeout_ms=1)
    except wmi.x_wmi_timed_out:
      pass
    else:
        if connected:
            
              print("Keyboard connected")
      


    try:
        disconnected = disconnected_watcher(timeout_ms=1)
    except wmi.x_wmi_timed_out:
      pass
    else:
        if disconnected:
          
              print("Disconnected")
          

j'apprécierai une suggestion


0 commentaires

3 Réponses :


0
votes

Une fois connecté, il sera toujours connecté. Vous devez terminer la boucle while une fois qu'elle est connectée.

Je ferais ceci:

if connected:
            
     print("Keyboard connected")
     break

Vous pouvez également créer une variable et remplacer la valeur "1". Ensuite, si vous ne souhaitez pas utiliser break, vous pouvez modifier la valeur de la variable.


1 commentaires

Je l'ai fait mais "Break" a arrêté mon temps et je ne peux pas arrêter le moment, je veux juste une impression par action



3
votes

Enregistrez l'état dans une variable et imprimez uniquement si l'état change:

state = 'unknown'
while 1:
    try:
        connected = connected_watcher(timeout_ms=1)
    except wmi.x_wmi_timed_out:
      pass
    else:
        if connected and state != 'connected':
            state = 'connected'
            print("Keyboard connected")

    try:
        disconnected = disconnected_watcher(timeout_ms=1)
    except wmi.x_wmi_timed_out:
      pass
    else:
        if disconnected and state != 'disconnected':
            state = 'disconnected'
            print("Disconnected")
          


0 commentaires

0
votes

J'en déduis que ce que vous essayez de faire est de vous connecter et de vous déconnecter aussi rapidement que possible, et d'imprimer le message lorsque l'état change. Dans ce cas, ce que vous recherchez, c'est ce changement. Vous devez implémenter la machine d'état appropriée. Pour le moment, votre processus échoue dès que vous revenez en haut, car vous ne réinitialisez jamais vos indicateurs de connexion. Essayez plutôt une simple variable statistique:

connected = False
while True:
    # loop until connected
    while not connected:
        try:
            connected = connected_watcher(timeout_ms=1)
        except wmi.x_wmi_timed_out:
            pass

    print("Keyboard connected")

    # loop until disconnected
    while connected:
        try:
            connected = not disconnected_watcher(timeout_ms=1)
        except wmi.x_wmi_timed_out:
            pass

    print("Keyboard disconnect")

Est-ce ce dont vous avez besoin?


0 commentaires