2017-10-11 2 views
0

Ich schrieb eine kleine Routine in Python 2.7, die einige Zeit wartet (sagen wir, 10 Minuten), aber sofort beendet, wenn eine Taste vom Benutzer gedrückt wird.Python 2.7 - Wie überprüft man, ob SHIFT-Taste oder STRG + Taste gedrückt wird?

Ich bin auf Windows (7, 64-Bit), so dass ich versuchte, die msvcrt Bibliothek:

import sys 
import msvcrt 
from time import sleep 

    def sleep_sec(secstosleep, allowskip = True): 
     waitinterval_ms = 0.050 
     nwaits = int(secstosleep * 1000/waitinterval) 

     sys.stdout.write("\n Sleeping for %s seconds. You can press CTRL-F12 to skip.\n\n" % secstosleep) 
     for sl in range(0, nwaits + 1): 
      sleep(waitinterval_ms) 
      if allowskip: 
       # Check if User has pressed CTRL-F12 to stop waiting 
       if = msvcrt.kbhit(): 
        kp = msvcrt.getch() 
        if kp == '\xe0': 
         print "\a" # Beep once 
         sys.stdout.write("\nSleep interrupted by User\n") 
         break 

In der Tat es funktioniert ganz gut, mit Ausnahme der Tatsache, dass es, wenn der Benutzer bricht Hits entweder F12, F11 oder Cursor-Up-Taste: Ich habe herausgefunden, dass getch(), wenn ich F12 drücke, das '\ xe0' zurückgibt, aber es scheint, dass der gleiche Code auch von den anderen erwähnten Tasten zurückgegeben wird; keine Möglichkeit, STRG, UMSCHALT, ALT usw. einzufangen.

Ich möchte den Benutzer zwingen, stattdessen CTRL-F12 zu drücken, um zu vermeiden, dass die Wartezeit durch versehentliches Drücken einer dieser Tasten beendet wird.

Mache ich etwas falsch? Gibt es eine Möglichkeit, die STRG-, ALT- oder UMSCHALTTASTE abzufangen, die mit einer anderen Taste gedrückt wird?

Vielen Dank im Voraus, Max - Italien

Antwort

1

Vom msvcrt Handbuch für msvcrt.getch():

[..] Wenn die gedrückte Taste eine spezielle Funktionstaste ist, wird diese Rückkehr '\ 000' oder '\ xe0'; Der nächste Anruf wird den Schlüsselcode zurückgeben.

Rufen Sie einfach getch() wieder den eigentlichen Schlüsselcode zu erhalten

+0

Vielen Dank, Daniel, jetzt funktioniert es perfekt !. Max. –

0

Wie Daniel vorgeschlagen, ich habe meinen Code wie folgt geändert:

import sys 
import msvcrt 
from time import sleep 

def sleep_sec(secstosleep, allowskip = True): 
    waitinterval_ms = 0.050 
    nwaits = int(secstosleep * 1000/waitinterval) 

    sys.stdout.write("\n Sleeping for %s seconds. You can press CTRL-F12 to skip.\n\n" % secstosleep) 
    for sl in range(0, nwaits + 1): 
     sleep(waitinterval_ms) 
     if allowskip: 
      # Check if User has pressed CTRL-F12 to stop waiting 
      if = msvcrt.kbhit(): 
       kp = msvcrt.getch() 
       if kp == '\xe0': 
        kp += msvcrt.getch() 

       if kp == '\xe0\x8a': # \x8a is the keycode for CTRL-F12 
        print "\a" # Beep once 
        sys.stdout.write("\nSleep interrupted by User\n") 
        break 

Ich habe auch bemerkt, dass verschiedene keycodes zurückgegeben werden für F12, CTRL-F12 und SHIFT-F12, so können Tastenanschläge leicht erkannt werden.

Nochmals vielen Dank, Daniel!

max.

Verwandte Themen