Danke für die Hilfe,
ich habe den MySQldb.connection.close in die def connect unter ein finally: gepackt.
Unten in der main() bin ich noch nicht Glücklich. Scheinbar muss in dem finally block der main() was drin stehen, sonst spinnt die rum.
Für die Prüfung ob der User bereits einen Eintrag hat, habe ich grade noch keine Lösung.
Auch der except KeyBoardInterrrupt ist noch am falschen Ort....
Code: Alles auswählen
#!/usr/bin/python3
import os
import RPi.GPIO as gpio
import MFRC522
import MySQLdb
import MySQLdb.cursors
from contextlib import closing
import time
DB_HOST = "XXX"
DB_USER = "XX"
DB_PASSWORD = "XXX"
ablaufaktiv = True
def connect():
try:
return MySQLdb.connect(host=DB_HOST, port=3307,
user=DB_USER , passwd=DB_PASSWORD, db="Schiessbuch",
cursorclass=MySQLdb.cursors.DictCursor)
finally:
MySQLdb.connection.close
def benutzer_anzeigen(db):
print()
with closing(db.cursor()) as cursor:
cursor.execute("""Select tbl_Benutzer.ID, tbl_Benutzer.UName, tbl_Benutzer.UVorname
FROM tbl_Benutzer INNER JOIN tbl_Karten ON tbl_Benutzer.ID = tbl_Karten.UserID""")
for row in cursor:
print( row["ID"], row["UName"], row["UVorname"])
def benutzer_registriert(db, user_id):
print()
with closing(db.cursor()) as cursor:
cursor.execute("""SELECT tbl_Schiesstand.UserID
FROM tbl_Schiesstand
Where tbl_Schiesstand.UserID = %d AND (DATE(tbl_Schiesstand.Beginn) = CURDATE() AND NOT DATE(tbl_Schiesstand.Ende) = CURDATE())""" % (user_id))
if cursor.fetchone():
print("Du bist bereits registriert")
time.sleep(5)
return False
else:
return True
def stand_anzeigen(db):
print()
with closing(db.cursor()) as cursor:
cursor.execute("Select ID, StandLang From tbl_Stand")
for row in cursor:
print( row["ID"], row["StandLang"])
def kaliber_anzeigen(db, stand_id):
print()
with closing(db.cursor()) as cursor:
cursor.execute("""Select tbl_Kaliber.ID, tbl_Kaliber.KaliberLang
From tbl_Stand INNER JOIN tbl_Kaliber ON tbl_Stand.ID = tbl_Kaliber.StandID
Where tbl_Stand.ID = %s""", (stand_id,))
for row in cursor:
print( row["ID"], row["KaliberLang"])
def schuetze_anlegen(db, user_id, stand_id, platz, kaliber_id, standaufsicht):
print()
with closing(db.cursor()) as cursor:
sql_query = """INSERT INTO `tbl_Schiesstand` (`UserID`, `StandID`, `Platz`, `KaliberID`, `Beginn`, `Standaufsicht`) VALUES (%s, %s, %s, %s, NOW(), %s)"""
data = (user_id, stand_id, platz, kaliber_id, standaufsicht)
cursor.execute(sql_query, data)
db.commit()
print("Du wurdest erfolgreich registriert")
time.sleep(5)
def input_int(prompt):
while True:
try:
print()
return int(input(prompt))
except ValueError:
print("Fehler: Keine Zahl eingegeben.")
#Funktion für die RFID Karten zulesen
def karte_erkennen():
continue_reading = True
MIFAREReader = MFRC522.Reader(0, 0, 22)
# This loop keeps checking for chips. If one is near it will get the UID and authenticate
while continue_reading:
# Scan for cards
(status, TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
# If a card is found
if status == MIFAREReader.MI_OK:
print("Card detected")
# Get the UID of the card
(status, uid) = MIFAREReader.MFRC522_Anticoll()
# If we have the UID, continue
if status == MIFAREReader.MI_OK:
# Print UID
print("Card read UID: " + str(uid[0]) + "," + str(uid[1]) + "," + str(uid[2]) + "," + str(uid[3])+ "," + str(uid[4]))
MIFAREReader.AntennaOff()
continue_reading=False
return str(uid[0])+str(uid[1])+str(uid[2])+str(uid[3])+str(uid[4])
def Gpio():
# Show no warnings
GPIO.setwarnings(False)
# Use GPIO pin numbers
GPIO.setmode(GPIO.BOARD)
def cardread():
cardId=karte_erkennen()
return cardId
def kartenid_Userid(db, cardID):
print()
with closing(db.cursor()) as cursor:
cursor.execute("""SELECT tbl_Benutzer.ID
FROM tbl_Benutzer INNER JOIN tbl_Karten ON tbl_Benutzer.ID = tbl_Karten.UserID
WHERE tbl_Karten.KartenNummer=%s """) %(cardID)
for row in cursor:
print( row["ID"])
return row["ID"]
def main():
while ablaufaktiv:
try:
os.system('clear')
print("Schiessbuch")
print()
print("Bitte erfasse deine Daten!")
#print()
#print("Bitte Scanne deine Karte!")
db = connect()
#cardread()
benutzer_anzeigen(db)
user_id = input_int("Bitte deine User ID eingeben: ")
benutzer_registriert(db, user_id)
#benutzer_registriert(db, kartenid_Userid)
stand_anzeigen(db)
stand_id = input_int("Bitte Stand eingeben: ")
kaliber_anzeigen(db, stand_id)
kaliber_id = input_int("Bitte Kaliber eingeben: ")
platz = input_int("Auf welchem Stand schiesst du?: ")
standaufsicht = 0
schuetze_anlegen(db, user_id, stand_id, platz, kaliber_id, standaufsicht)
except KeyboardInterrupt:
print("Abbruch")
finally:
print("Ende")
if __name__ == '__main__':
main()
Den Keyboard Interput habe ich mal so zusammen kopiert:
Code: Alles auswählen
def keyboardInterruptHandler(signal, frame):
print("Abbruch durch Benutzer (ID: {}) wurde gedrückt.".format(signal))
exit(0)
signal.signal(signal.SIGINT, keyboardInterruptHandler)