@Tombo: Das wird vielleicht ein bisschen komplizierter als Du Dir das vielleicht vorgestellt hast weil bei GUI-Programmen der Programmfluss anders funktioniert. Den gibst Du da nicht als Programmierer komplett vor sondern das GUI-Rahmenwerk beziehungsweise der Benutzer. Man hat dort keine lange laufenden Programmstücke mehr, oder man muss sie in Threads auslagern und dann dafür sorgen das diese sicher mit dem Thread kommunizieren können in dem der GUI-Thread läuft. Und die meisten GUI-Rahmenwerke sind nicht thread-sicher oder nur ganz wenige bestimmte Funktionen/Methoden sind das. Was bedeutet das man die GUI nur vom GUI-Thread aus verändern darf, sonst ist das Programmverhalten undefiniert und es können Abstürze oder allgemein komisches, unverhersehbares Verhalten auftreten. Wie man genau aus unterschiedlichen Threads mit der GUI interagieren kann hängt vom konkret eingesetzten GUI-Rahmenwerk ab.
Zur gezeigten Funktion fällt auf das `read` überflüssig ist weil man am Ende wenn ein Tag gelesen werden konnte die Funktion einfach mit ``return`` verlassen kann. Die Schleife würde dann mit ``while True:`` zu einer ”Endlosschleife”.
Funktionen sollten auch immer nur eine Sache erledigen und nicht wie in diesem Fall scannen *und* die gelesene ID irgendwie weiterverarbeiten. Die `scan()`-Funktion sollte die ID als Rückgabewert haben. Dann kann man die Funktion isoliert testen und zum Beispiel die selbe Funktion in verschiedenen Programmen verwenden die unterschiedliche Dinge mit dem Ergebnis anstellen.
Der Name `MIFAREReader` hält sich in der Schreibweise nicht an die üblichen Namenskonventionen, nach der nur Klassen in MixedCase geschrieben werden:
Style Guide for Python Code.
Beim `MFRC522_Request()`-Aufruf wertest Du den Status nicht aus.
Die `cardid` wird fehlerhaft erstellt denn auf diese Weise können Tags mit unterschiedlicher ID den gleichen `cardid`-Wert bekommen, was ja dem Zweck einer ID zuwider läuft.
Das verwendete Modul zum Kommunizieren mit dem NFC-Gerät ist teilweise ziemlich schreckliches Python, beziehungsweise gar kein Python sondern eher so etwas wie C in Python-Syntax. Wie man zum Beispiel in einem Beispielprogramm darauf kommen kann die Tastenkombination Strg+C über einen Signalhandler und mit einer globalen Variable um mit der Hauptschleife zu kommunizieren damit die weiss das sie anhalten soll, ist mir ein Rätsel. Auf so etwas umständliches statt einfach ``try``/``except`` und `KeyboardInterrupt` zu verwenden kann eigentlich niemand kommen der Python kann. Es gibt da auch ``while``-Schleifen die manuell Indexvariablen hochzählen. Und neben der Schreibweise der Namen ist auch die Namensgebung selbst bei den Methoden der `MFRC522`-Klasse furchtbar weil sehr viele der Methoden nochmal `MFRC522` als Teil des Namens enthalten. Dabei nicht mal konsequent bei allen und auch nicht immer als Prä- oder immer als Postfix. Das viele Methoden einen Status *und* ein Ergebnis zurückgeben und man immer erst den Status prüfen muss bevor man etwas mit dem Ergebniswert anstellt, ist in einer Programmiersprache die Ausnahmen kennt auch schlecht.