GUI Programierung Trigger event bei Boolean

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
Tombo
User
Beiträge: 3
Registriert: Freitag 6. März 2015, 14:33

Hallo zusammen,

Ich habe ein Warenwirtschaftssystem mit Hilfe eines Raspberry Pi, RFID und Barcodescanner geschrieben. Derzeit funktioniert auch alles soweit sehr gut, aber als "Shell Programm". Und nun dachte ich mir man könnte das ganze doch noch etwas schöner gestalten wenn man dazu eine GUI basteln würde.

Der Aufbau des Programmes ist relativ einfach da es mein erstes Programmier Projekt war.

Zu meiner Frage, Ich benutze für mein Programm einen MFRC522 reader und diese Klasse

In Meinem Programm ist das so gelöst:

Code: Alles auswählen

def scan():
    read = True
    while read:
        (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
        time.sleep(0.5)
        (status,uid) = MIFAREReader.MFRC522_Anticoll()
        if status == MIFAREReader.MI_OK:
            cardid = str(uid[0]) +str(uid[1]) +str(uid[2]) +str(uid[3]) +str(uid[4])
            read = False
            who_am_i(cardid)
Wie kann ich am Sinnvollsten jetzt sobald status == MIFAREReader.MI_OK: zum Beispiel ein Label Updaten und ein Bild Anzeigen lassen? und einen Barcode (Barcode scanner arbeitet wie eine Tastatur und am ende enter) einlesen lassen.

Wäre toll wenn mich jemand unterstützen möchte!

Hier der Link zu dem Projekt http://www.forum-raspberrypi.de/Thread- ... ungssystem
Zuletzt geändert von Anonymous am Freitag 6. März 2015, 15:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@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.
Tombo
User
Beiträge: 3
Registriert: Freitag 6. März 2015, 14:33

Hallo @BlackJack ,

Erstmal Sorry das ich mich erst jetzt wieder melde und mich nicht voher schon bedankt habe das du dir zeit genommen hast mir zu Antworten..., und vielen dank für die Ausführliche Beschreibung. Leider hast du recht und es ist wirklich nicht so einfach wie ich mir das vorgestellt habe. Trozdem habe ich mir vorgenommen das Projekt nochmal neu anzugehen und versuchen das ganze in "schönem Python" zu Programmieren :).


"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."
-- Was genau mache ich Falsch? Kannst du mir das erklären ?

"Das verwendete Modul zum Kommunizieren mit dem NFC-Gerät ist teilweise ziemlich schreckliches Python"
-- Leider habe ich nur diese Bibliothek gefunden, und es würde zu lange dauern (in meinem Wissenstand das selbst zu bauen) :|

Ich weiss noch nicht wie ich es schaffen werde das als GUI zu Programmieren aber ich werde auf jeden Fall mal etwas rumspielen bzw. mein Programm nach deinen Tipps zu verbessern.

Nochmals vielen dank, ich werde mich melden wenn ich weitergekommen bin :)

Viele Grüße,
Tombo
BlackJack

@Tombo: Bei `cardid` werden vier Bytewerte in Zeichenketten mit der dezimalen Zahldarstellung umgewandelt und per ``+`` zusammengefügt. Mal ein Beispiel für ein Ergebnis: '00123' — das könnte 0, 0, 12, 3 gewesen sein, aber auch 0, 0, 1, 23. Wie hält man die auseinander? Üblicherweise wandelt man so etwas in eine Hexadezimaldarstellung mit zwei Zeichen pro Bytewert um:

Code: Alles auswählen

In [11]: binascii.b2a_hex(bytearray([0, 0, 1, 23]))
Out[11]: '00000117'

In [12]: binascii.b2a_hex(bytearray([0, 0, 12, 3]))
Out[12]: '00000c03'
Tombo
User
Beiträge: 3
Registriert: Freitag 6. März 2015, 14:33

Hallo BlackJack,

ah oke, klar macht Sinn

Danke
Antworten