Script in Funktion umwandeln

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
rob87
User
Beiträge: 45
Registriert: Donnerstag 17. Oktober 2019, 14:24

Hi,

Ich habe ein Script das ich gerne Modularisieren möchte. Das Problem ist das die "Print"-Anweisung in der Funktion ausgeführt wird jedoch nichts ausgibt.
Script das funktioniert:

Code: Alles auswählen

import evdev
from evdev import InputDevice, categorize, ecodes  
dev = InputDevice('/dev/input/event1')

# Provided as an example taken from my own keyboard attached to a Centos 6 box:
scancodes = {
    # Scancode: ASCIICode
    0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8',
    10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'q', 17: u'w', 18: u'e', 19: u'r',
    20: u't', 21: u'y', 22: u'u', 23: u'i', 24: u'o', 25: u'p', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL',
    30: u'a', 31: u's', 32: u'd', 33: u'f', 34: u'g', 35: u'h', 36: u'j', 37: u'k', 38: u'l', 39: u';',
    40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\\', 44: u'z', 45: u'x', 46: u'c', 47: u'v', 48: u'b', 49: u'n',
    50: u'm', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
}

capscodes = {
    0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 9: u'*',
    10: u'(', 11: u')', 12: u'_', 13: u'+', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',
    20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'{', 27: u'}', 28: u'CRLF', 29: u'LCTRL',
    30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u':',
    40: u'\'', 41: u'~', 42: u'LSHFT', 43: u'|', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 49: u'N',
    50: u'M', 51: u'<', 52: u'>', 53: u'?', 54: u'RSHFT', 56: u'LALT',  57: u' ', 100: u'RALT'
}
#setup vars
x = ''
caps = False

#grab provides exclusive access to the device
dev.grab()

#loop
for event in dev.read_loop():
    if event.type == ecodes.EV_KEY:
        data = categorize(event)  # Save the event temporarily to introspect it
        if data.scancode == 42:
            if data.keystate == 1:
                caps = True
            if data.keystate == 0:
                caps = False
        if data.keystate == 1:  # Down events only
            if caps:
                key_lookup = u'{}'.format(capscodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
            else:
                key_lookup = u'{}'.format(scancodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
            if (data.scancode != 42) and (data.scancode != 28):
                x += key_lookup  
            if(data.scancode == 28):
                print (x)          # Print it all out!
                x = ''

Hier das funktioniert nicht:

Code: Alles auswählen

import evdev
from evdev import InputDevice, categorize, ecodes  
dev = InputDevice('/dev/input/event1')
class RfidReader:
# Provided as an example taken from my own keyboard attached to a Centos 6 box:

	def __init__(self):
		self.scancodes = {
			# Scancode: ASCIICode
			0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8',
			10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'q', 17: u'w', 18: u'e', 19: u'r',
			20: u't', 21: u'y', 22: u'u', 23: u'i', 24: u'o', 25: u'p', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL',
			30: u'a', 31: u's', 32: u'd', 33: u'f', 34: u'g', 35: u'h', 36: u'j', 37: u'k', 38: u'l', 39: u';',
			40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\\', 44: u'z', 45: u'x', 46: u'c', 47: u'v', 48: u'b', 49: u'n',
			50: u'm', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
			}
			
		self.capscodes = {
			0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 9: u'*',
			10: u'(', 11: u')', 12: u'_', 13: u'+', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',
			20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'{', 27: u'}', 28: u'CRLF', 29: u'LCTRL',
			30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u':',
			40: u'\'', 41: u'~', 42: u'LSHFT', 43: u'|', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 49: u'N',
			50: u'M', 51: u'<', 52: u'>', 53: u'?', 54: u'RSHFT', 56: u'LALT',  57: u' ', 100: u'RALT'
		} 
		
		self.code=""
		
	def decode_event(self,event,capscodes,scancodes):
	#setup vars
		x = ''
		caps = False
		if event.type == ecodes.EV_KEY:
			data = categorize(event)  # Save the event temporarily to introspect it
			if data.scancode == 42:
				if data.keystate == 1:
					caps = True
				if data.keystate == 0:
					caps = False
			if data.keystate == 1:  # Down events only
				if caps:
					key_lookup = u'{}'.format(capscodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
				else:
					key_lookup = u'{}'.format(scancodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
				if (data.scancode != 42) and (data.scancode != 28):
					x += key_lookup  
				if(data.scancode == 28):
					print(x)         # Print it all out!

					
reader=RfidReader()
#grab provides exclusive access to the device
dev.grab()

#loop
for event in dev.read_loop():
	reader.decode_event(event,reader.capscodes,reader.scancodes)
	#print (reader.code)


Vermutlich kann er das Scancodes -Dict nicht ansprechen...

nur warum?
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene und nicht mit Tab-Zeichen.
`edev` wird importiert, aber nicht verwendet.

Klassen sind ja dazu da, dass man sich den Zustand merken kann, aber die Methode `decode_event` ändert gar keinen Zustand, benutzt `self` nicht. Und das ist der Fehler.
`data.scancode` kann entweder gleich 28 sein, dann wird das leere x ausgegeben, oder ist ungleich 28, dann wird x mit einem Wert belegt. Beides kann nicht gleichzeitig wahr sein und deshalb wird nie etwas anderes als ein leerer String ausgegeben.

Konstanten schreibt man komplett GROSS und definiert sie nicht innerhalb von __init__.
capscodes und scancodes sind eigentlich Konstanten, müssen `decode_event` nicht übergeben werden, weil sie ja schon an self gebunden sind.
Statt Bedingungen zu wiederholen, kann man elif benutzen.
Strings sind in Python3 automatisch Unicodestrings, das u ist nicht mehr nötig.
`.format` dazu zu benutzen, um den selben String in sich selbst zu verwandeln ist ziemlich umständlich.

Warum heißt die Klasse RfidReader? Das hat doch gar nichts mit RFID zu tun?

Code: Alles auswählen

from evdev import InputDevice, categorize, ecodes  

class KeyDecoder:
    SCANCODES = {
        # Scancode: ASCIICode
        0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8',
        10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'q', 17: u'w', 18: u'e', 19: u'r',
        20: u't', 21: u'y', 22: u'u', 23: u'i', 24: u'o', 25: u'p', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL',
        30: u'a', 31: u's', 32: u'd', 33: u'f', 34: u'g', 35: u'h', 36: u'j', 37: u'k', 38: u'l', 39: u';',
        40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\\', 44: u'z', 45: u'x', 46: u'c', 47: u'v', 48: u'b', 49: u'n',
        50: u'm', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
    }
        
    CAPS_SCANCODES = {
        0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 9: u'*',
        10: u'(', 11: u')', 12: u'_', 13: u'+', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',
        20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'{', 27: u'}', 28: u'CRLF', 29: u'LCTRL',
        30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u':',
        40: u'\'', 41: u'~', 42: u'LSHFT', 43: u'|', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 49: u'N',
        50: u'M', 51: u'<', 52: u'>', 53: u'?', 54: u'RSHFT', 56: u'LALT',  57: u' ', 100: u'RALT'
    } 

    def __init__(self):
        self.code = ""
        self.caps = False
        
    def decode_event(self, event):
        if event.type == ecodes.EV_KEY:
            data = categorize(event)
            if data.scancode == 42:
                self.caps = data.keystate == 1
            elif data.keystate == 1:  # Down events only
                if data.scancode == 28:
                    print(self.code)
                    self.code = ""
                else:
                    codes = self.CAPS_SCANCODES if self.caps else self.SCANCODES
                    try:
                        key_lookup = codes[data.scancode]
                    except KeyError:
                        key_lookup = 'UNKNOWN:[{}]'.format(data.scancode)
                    self.code += key_lookup


def main():
    decoder = KeyDecoder()
    dev = InputDevice('/dev/input/event1')
    dev.grab()
    for event in dev.read_loop():
        decoder.decode_event(event)

if __name__ == "__main__":
    main()
rob87
User
Beiträge: 45
Registriert: Donnerstag 17. Oktober 2019, 14:24

Hi,

die Event kamen von einem RFID-Reader ;).

Sonst funktioniert der Code perfekt. Danke.
Antworten