Rfid und Gui Tkinter

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo Zusammen,



    Ich beschäftige mich gerade mit RFID - RC522 Modul und Tkinter GUI.


    Mein Ziel ist es ganaz einfach an einem Display ein gui zu erstellen wo steht "Halte bitte deine Karte an deine Leser". Nachdem man die Karte an dem RFID - RC522 Modul hält soll gui darauf reagieren und mit "Danke!" antworten.


    Also den GUI TKinter kann ich so programmieren das es die label anzeigt. Ebenso läuft der RFID - RC522 Modul* als reader and writer


    Ich habe 2 Überlegungen, einmal mit class Funktion oder als Thread das Problem zu lösen, jedoch bräuchte ich hierfür erstens den Ratschlag was sinvoller ist und Hinweise wie ich damit Anfangen sollte bzw. wo ich den Ansatz setzen soll...


    Danke euch im voraus.







    *https://joy-it.net/files/files…-Anleitung-09-06-2020.pdf

  • Hallo,


    eine "class Function" gibt es nicht. Entweder man benutzt eine Funktion, die wird mit 'def' eingeleitet oder man will eine Klasse definieren, diese wird mit 'class' eingeleitet.


    Grundsätzlich solltest du beim programmieren immer mit Funktionen arbeiten. Ausführbarer Code sollte nie außerhalb einer Funktion stehen, so wie es bei dir gerade ist.


    GUI's benötigen häufig Klassen. Aber erst mal noch eine Frage: Für mich liest es sich so, dass du auf das Programm bestimmt noch weiters aufbauen willst. Ist das alles was das Programm können soll oder was soll es können wenn es fertig ist?

    Nicht das du dein ganzes Programm wieder umschmeißen musst, wenn du darauf aufbauen willst.


    Grüße

    Dennis

    🎧 Marylin´s Befehle an meine Junge Seele hör ich in jedem Lied. Heimlich eingegeben, in mein Innenleben, durch den Hard-Rock Beat 🎧


  • Hey Dennis,


    danke für die Erläuterung des Unterschiedes, der Unterschied ist jetzt für mich klarer.


    Ich würde gerne anschließend noch Zeiterfassen wollen. Also quasi einstempeln und ausstempeln und dabei am Display die Dauer ablesen können. Muss aber nicht in eine Datenbank speichern.


    Für andere GUI vorschläge bin ich übrigens auch offen, bin auch bereit es zu lernen.



    Beste Grüße

    Muskieg

  • Okay, das heißt du musst dir die Startzeit merken um beim Abstempeln die Dauer auszurechnen. Sobald man sich etwas merken will benötigt man eine Klasse. Das heißt auch, dass du Objekt-orientierte-Programmierung lernen musst. Es gibt von Python ein offizielles Tutorial, das sollte dir den Umgang mit Funktionen und Klassen näher bringen:

    The Python Tutorial — Python 3.10.2 documentation


    Bei Fragen kannst du dich gerne melden.


    Ich würde danach mal anfangen, die Berechnung der Dauer ohne GUI und ohne Chip zu schreiben, danach dann ein Fenster mit einem Stop- und Start-Button. Und dann damit das stempeln zu simulieren. Wenn das klappt würde ich mich erst um den Chip kümmern. Die Probleme immer in so kleine Teilprobleme wie möglich aufteilen.

    Dabei hilft es auch (mir zumindest) die ganze Funktionen des Programms stichwortartig aufzuschreiben und daraus dann dein Programm aufzubauen. Nennt sich Funktionsstruktur.


    'tkinter' ist dafür gut geeignet und finde ich zum Einstieg auch gut.


    Grüße

    Dennis

    🎧 Marylin´s Befehle an meine Junge Seele hör ich in jedem Lied. Heimlich eingegeben, in mein Innenleben, durch den Hard-Rock Beat 🎧

  • Muskieg: Der gezeigte Quelltext ist syntaktisch falsch, weil da Code falsch eingerückt ist.


    Den ``try``-Block würde ich ein ganz kleines bisschen weiter fassen, weil man ja nicht weiss was bei `SimpleMFRC522` beim erstellen des Objekts intern so falsch laufen kann und zu einer Ausnahme führen könnte.


    Die Fenstergrösse sollte man nicht vorgeben, die ergibt sich automatisch aus dem Fensterinhalt.


    `id` ist der Name einer eingebauten Funktion, solche Namen sollte man nicht mit anderen Werten überschreiben/verdecken. Man kann dann die `id()`-Funktion nicht mehr verwenden in dem Namensraum, und es kann Leser verwirren.


    Zwischenstand wäre dann:

    Das ist so nicht wirklich sinnvoll und funktioniert nicht wirklich garantiert, denn soweit ich weiss, ist das nicht garantiert, dass die GUI vor dem Aufruf der `mainloop()` angezeigt wird. Und reagieren tut die GUI auch nicht. Unter Windows würde man da irgendwann die Nachfrage vom Betriebssystem bekommen ob man die nicht reagierende Anwendung beenden will. Das könnte eine Fensterverwaltung unter Linux theoretisch auch machen. Ist also nicht sauber programmiert.


    Wenn man eine blockierende Aktion in einer GUI machen will, kommt man um Threads in der Regel nicht herum. Da die GUI nur aus dem Hauptthread manupuliert werden darf, dort wo die `mainloop()` läuft, kommuniziert man üblicherweise mit einer `Queue` aus dem `queue`-Modul und fragt die von der GUI-Seite aus regelmässig mit Hilfe der `after()`-Methode auf Widgets ab, ob es Daten zu verarbeiten gibt.

    „Eat the rich — the poor are full of preservatives.“ — Rebecca ”Becky” Connor, The Connors

  • Hallo Dennis89 und __blackjack__ ,


    habe mit euren Ansätzen das erreichen können was ich zunächst erstmal wollte. Vielen Dank nochmal für euer support...


    Falls ich auf neue probleme Stoße melde ich mich, vorerst lasse ich diesen Beitrag/Thema als erledigt

  • Hallo Zusammen,


    ich habe aktuell ein Vollbild GUI bei dem steht "Halte deine Karte" und sobald man die Karte/den chip an den RFID Modul hält zeigt es die ID Nummer und die aktuelle Uhrzeit für 5s an. Soweit alles gut. :)


    Nun möchte ich aber auch den python script stoppen können. Hierzu möchte ich aber kein Button oder ähnliches einbauen. Was ich möchte ist so eine Art Befehl/Tastenkombination über ssh Verbindung z.B. wenn ich Strg+c drücke ich aus dem mainloop sicher bzw. fehlerfrei rausgehen kann...


    Beste Grüße aus Karlsruhe

    Muskieg

  • Post by Muskieg ().

    The post was deleted, no further information is available.
  • Hallo,


    zu deinem Code:

    Verwende keine *-Importe. Damit holst du dir alle Namen von 'tkinter' in deinen Namensraum. Dazu gehören auch die, die in 'tkinter' importiert werden. Das heißt du hast gar keine Kontrolle, welche Namen schon vergeben sind und du hast auch keine Ahnung wo welcher Namen herkommt. Das kann zu Kollisionen und zur erschwerten Problemfindung führen.

    'as' ist zum umbennenen da. Du nennst 'GPIO' in 'GPIO' um. Wenn dann from RPi import GPIO as gpio. Aber da du das in deinem Code nicht verwendest, kann das auch weg.

    Auf Modulebene sollte kein ausführbarer Code stehen. Das was bei dir da steht, gehört in eine Funktion, üblicherweise mit dem Namen 'main'. Der Code wird jetzt durch die 'geometry' nur auf bestimmten Bildschirmen korrekt dargestellt, es sei denn '-fullscreen' überschreibt das wieder

    'screen' wird gar nicht benutzt.

    Nur Klassen schreibt man in Python in PascalCase.

    'while' benötigt keine Klammer.

    Namen schreibt man in Python klein_mit_unterstrich. Wenn es kein 'Text2' gibt, was sagt einem dann die 1 in 'Text1'? Allgemein sind nummerierte Namen nicht oft aussagekräftig. Wenn man die Namen durchnummeriert, weil einem nichts besseres einfällt, dann braucht man die vielleicht gar nicht und man will eher eine Datenstruktur, wie bspw. eine Liste.

    'now' kannst du dir eigentlich sparen und alles in einer Zeile schreiben und gleich für 'dt_string' einen sprechenden Namen ohne erfundene Abkürzung tauschen und daran datetime.now().strftime("%H:%M:%S") binden.

    Wenn aus einem Grund der 'try'-Block nicht durchläuft, dann kann es sein, dass in 'finally' 'chip' und 'Text1' nocht nicht definiert sind.

    Aber die gehören auch gar nicht in die Funktion in der sie gerade stehen. Jetzt wird ja in jedem Schleifendurchgang zwei neue Labels erstellt.

    Erstelle in der '__init__' jeweils das Label und ändere in deiner Funktion nur den 'text' des Labels.

    Anstatt eines Threads hättest du auch die 'after'-Methode von 'tkinter' nutzen können.


    Beispiel zum Text kann ich noch nachreichen, ist mir jetzt zu spät :sleepy:


    Grüße

    Dennis

    🎧 Marylin´s Befehle an meine Junge Seele hör ich in jedem Lied. Heimlich eingegeben, in mein Innenleben, durch den Hard-Rock Beat 🎧