@Sirius3: Ich dachte so werden Variablen erstmal leer deklariert. Mein Fehler.
@__blackjack__:
Wahnsinnigen Dank für die ganzen Hinweise.
"Der Hinweis von Sirius3 mit den Argumenten wird schnell deutlich wenn man den Code und die Variablen auf Modulebene in einer Funktion verschwinden lässt. Das hat auf Modulebene nämlich nichts zu suchen." --> Danke, hier hat mir wohl noch grundlegendes Wissen über die Struktur generell gefehlt.
"Bei Textdateien sollte man beim öffnen immer die Kodierung explizit angeben und bei CSV-Dateien die mit dem `csv`-Modul verarbeitet werden sollen, muss man ``newline=""`` als Argument übergeben." --> Da werde ich mich nochmal einlesen um es zu verstehen, weil es ja auch ohne funktioniert hat. Möchte es aber verstehen, danke für den Hinweis.
"Bei sich gegenseitig ausschliessenden ``if``-Bedingungen verwendet man ``elif`` denn es macht ja keinen Sinn Bedingungen zu prüfen von denen man schon sicher weiss, das sie nicht zutreffen können." --> Das klingt mehr als logisch. auch dafür vielen Dank.
"In den Spalten in der CSV-Datei wo "Ja"/"Nein" steht, kann/darf da auch etwas anderes stehen? Falls nicht, sollte man auch diesen Fall im Programm berücksichtigen und beispielsweise eine Warnung ausgeben, protokollieren, oder gar in einem Fenster ausgeben." --> Da darf nix anderes stehen, dass mit der Warnung ist eine gute Idee.
"Ich vermute mal die RFID in der CSV-Datei sollte eindeutig sein, das heisst wenn man die in der Datei gefunden hat, kann man die Schleife abbrechen, denn die wird dann ja in den weiteren Zeilen nicht noch mal gefunden werden. Dann kann man sich auch das Flag sparen ob der Wert gefunden wurde und mit ``break`` und ``else`` arbeiten." --> Da hast du vollkommen Recht, die RFID ist eindeutig. Nach dem gefunden werden, soll aber das Display gecleared werden und anschließend gleich eine neuer RFID Chip eingelesen werden können... usw
"In `clear_display()` wird `platzhalter` definiert aber nirgends verwendet." --> Das war noch ein Überbleibsel aus dem allerersten Versuch, hatte ich übersehen, danke.
Ich habe nun deinen Code mal genutzt und angepasst (Variablennamen eindeutig wie von @Sirius3 empfohlen) und ich musste die grid Referenzen mit eckigen Klammern angeben, sonst gab es Fehler.
Also grid=[0,1] statt grid=(0,1)
Das mit dem image Path funktioniert aber trotzdem nicht...
Code: Alles auswählen
#!/usr/bin/env python3
import csv
from pathlib import Path
from gpiozero import LED
from guizero import App, Picture, Text, TextBox
DOCUMENTS_PATH = Path("/home/pi/Documents")
def clear_display(
led_needing_a_better_name,
rfid_text,
foto,
user,
permission,
licence,
no_licence,
no_licence_warning,
no_permission,
no_permission_warning,
):
print("Clear display")
for widget in [
user,
permission,
licence,
no_licence,
no_licence_warning,
no_permission,
no_permission_warning,
rfid_text,
foto,
]:
widget.value = ""
led_needing_a_better_name.off()
user.repeat(
1000,
check_rfid_tag,
[
led_needing_a_better_name,
rfid_text,
foto,
user,
permission,
licence,
no_licence,
no_licence_warning,
no_permission,
no_permission_warning,
],
)
def check_rfid_tag(
led_needing_a_better_name,
rfid_text,
foto,
user,
permission,
licence,
no_licence,
no_licence_warning,
no_permission,
no_permission_warning,
):
tag_id = rfid_text.value
if tag_id:
print(tag_id)
with open("Database.csv", encoding="utf-8", newline="") as csv_file:
for row in csv.DictReader(csv_file):
if row["RFid"] == tag_id:
user.value = "Test " + row["User"]
foto.value = DOCUMENTS_PATH / row["RFid"] + ".jpg"
if row["1"] == "Ja":
permission.value = " Tu X: " + row["1"]
elif row["1"] == "Nein":
no_permission.value = " Tu Y: " + row["1"]
no_permission_warning.value = "Bitte beachten!"
if row["2"] == "Ja":
licence.value = " Test: " + row["2"]
elif row["2"] == "Nein":
no_licence.value = " Test: " + row["2"]
no_licence_warning.value = "Ebenfalls beachten!"
led_needing_a_better_name.on()
clear_display_delay = 8000
break
else:
clear_display_delay = 1000
user.value = "Mitglied nicht bekannt"
user.after(
clear_display_delay,
clear_display,
[
led_needing_a_better_name,
rfid_text,
foto,
user,
permission,
licence,
no_licence,
no_licence_warning,
no_permission,
no_permission_warning,
],
)
user.cancel(check_rfid_tag)
def main():
led_needing_a_better_name = LED(19)
app = App(title="Verein", width=640, height=440, layout="grid")
# picture = Picture(app, image=foto, grid=(0, 2))
foto = Text(app, grid=[0,0], size=23, font="calibri", color="grey")
rfid_text = TextBox(app, grid=[0,1], width=50)
user = Text(
app,
grid=[0,3],
align="left",
size=28,
font="calibri",
color="#558B63",
)
permission = Text(
app,
grid=[0,4],
align="left",
size=28,
font="calibri",
color="#558B63",
)
no_permission = Text(
app, grid=[0,4], align="left", size=28, font="calibri", color="red",
)
licence = Text(
app,
grid=[0,5],
align="left",
size=28,
font="calibri",
color="#558B63",
)
no_licence = Text(
app, grid=[0,5], align="left", size=28, font="calibri", color="red",
)
no_permission_warning = Text(app, grid=[0,7], size=28, font="calibri", color="red")
no_licence_warning = Text(app, grid=[0,8], size=28, font="calibri", color="red")
user.repeat(
1000,
check_rfid_tag,
[
led_needing_a_better_name,
rfid_text,
foto,
user,
permission,
licence,
no_licence,
no_licence_warning,
no_permission,
no_permission_warning,
],
)
app.display()
if __name__ == "__main__":
main()
Der Fehler lautet:
foto.value = DOCUMENTS_PATH / row["RFid"] + ".jpg"
TypeError: unsupported operand type(s) for +: 'PosixPath' and 'str'
Das mit dem Setzen des DOCUMENTS_PATH find ich klasse. Danke auch für diesen Tipp...
Viele Grüße