Im eine Reihe von meiner db zu bekommen versuchen, von der Anzeige auf einem tk Text-Widget, wenn 1 und entfernen, um anzuzeigen, wenn 0.Anzeige SQLite Ausgabe in TK Python
Der Code, den ich bisher habe die Zeile für eine Karte zeigt, . Wenn ich eine Sekunde scanne, bekomme ich einen Fehler von.
SQLite objects created in a thread can be used in that same thread.The object was created in thread id 6740 and this is thread id 6320
<traceback object at 0x02AAC418>
<class 'sqlite3.ProgrammingError'>
Traceback (most recent call last):
File "C:\rfid\main2.py", line 66, in <module>
cardmonitor.addObserver(cardobserver)
File "C:\Python27\lib\site-packages\smartcard\CardMonitoring.py", line 105, in addObserver
observer.update(self, (self.rmthread.cards, []))
File "C:\rfid\main2.py", line 56, in update
a(tag)
File "C:\rfid\main2.py", line 25, in a
root.mainloop()
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1017, in mainloop
self.tk.mainloop(n)
KeyboardInterrupt
Hauptcode unten
import sqlite3 as db
import os
from prettytable import from_db_cursor
from smartcard.scard import *
from smartcard.util import toHexString
from prettytable import from_db_cursor
from smartcard.CardMonitoring import CardMonitor, CardObserver
import time
from Tkinter import Tk, BOTH, INSERT, Text
def main(tag):
q = "SELECT * FROM CARDS WHERE TAG=?"
up = "UPDATE CARDS SET FLAG = (CASE WHEN FLAG=0 THEN 1 ELSE 0 END) WHERE TAG=?"
id = "SELECT * FROM CARDS WHERE TAG=?"
cursor.execute(q, (tag,))
cursor.execute(up, (tag,))
conn.commit()
for row in cursor.execute(id, (tag,)):
print row [1] + row[2] #debugging to console
r1 = str(row[1])
r2 = str(row[2])
msg = str(r1 + r2)
text_widget = Text(root, font='times 40 bold', bg='Green')
text_widget.pack(fill=BOTH, expand=0)
text_widget.tag_configure('tag-center', wrap='word', justify='center')
text_widget.insert(INSERT, msg, 'tag-center')
root.mainloop()
class printobserver(CardObserver):
def update(self, observable, (addedcards, removedcards)):
previousIdString = ""
idString = ""
for card in addedcards:
if addedcards:
hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
assert hresult==SCARD_S_SUCCESS
hresult, readers = SCardListReaders(hcontext, [])
assert len(readers)>0
reader = readers[0]
hresult, hcard, dwActiveProtocol = SCardConnect(
hcontext,
reader,
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
hresult, response = SCardTransmit(hcard,dwActiveProtocol,[0xFF,0xCA,0x00,0x00,0x04])
v = toHexString(response, format=0)
tag = str(v)
main(tag)
conn = db.connect('cards3.db')
root = Tk()
while True:
cursor = conn.cursor()
cardmonitor = CardMonitor()
cardobserver = printobserver()
cardmonitor.addObserver(cardobserver)
cardmonitor.deleteObserver(cardobserver)
time.sleep(2)
Update: Von Antworten unten Ich habe jetzt die folgenden müde.
Conn.cursor in die Klasse verschoben, aber gleich. Verschiedene Fehler sind Coursor is not defined
import sqlite3 as db
import os
from prettytable import from_db_cursor
from smartcard.scard import *
from smartcard.util import toHexString
from prettytable import from_db_cursor
from smartcard.CardMonitoring import CardMonitor, CardObserver
import time
from Tkinter import Tk, BOTH, INSERT, Text
def main(tag):
q = "SELECT * FROM CARDS WHERE TAG=?"
up = "UPDATE CARDS SET FLAG = (CASE WHEN FLAG=0 THEN 1 ELSE 0 END) WHERE TAG=?"
id = "SELECT * FROM CARDS WHERE TAG=?"
cursor.execute(q, (tag,))
cursor.execute(up, (tag,))
conn.commit()
for row in cursor.execute(id, (tag,)):
print row [1] + " has been checked " + ('in' if row[2] else 'out')
r1 = str(row[1])
r2 = str(row[2])
mseg = str(r1 + r2)
text_widget = Text(root, font='times 40 bold', bg='Green')
text_widget.pack(fill=BOTH, expand=0)
text_widget.tag_configure('tag-center', wrap='word', justify='center')
text_widget.insert(INSERT, r1 + r2, 'tag-center')
root.mainloop()
class printobserver(CardObserver):
cursor = conn.cursor()
def update(self, observable, (addedcards, removedcards)):
previousIdString = ""
idString = ""
for card in addedcards:
if addedcards:
hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
assert hresult==SCARD_S_SUCCESS
hresult, readers = SCardListReaders(hcontext, [])
assert len(readers)>0
reader = readers[0]
hresult, hcard, dwActiveProtocol = SCardConnect(
hcontext,
reader,
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
hresult, response = SCardTransmit(hcard,dwActiveProtocol,[0xFF,0xCA,0x00,0x00,0x04])
v = toHexString(response, format=0)
tag = str(v)
main(tag)
conn = db.connect('cards3.db')
root = Tk()
while True:
cardmonitor = CardMonitor()
cardobserver = printobserver()
cardmonitor.addObserver(cardobserver)
cardmonitor.deleteObserver(cardobserver)
time.sleep(2)
müde Haben auch in Haupt- und Update setzen, aber immer noch denselben Fehler
def main(tag):
cursor = conn.cursor
q = "SELECT * FROM CARDS WHERE TAG=?"
up = "UPDATE CARDS SET FLAG = (CASE WHEN FLAG=0 THEN 1 ELSE 0 END) WHERE TAG=?"
id = "SELECT * FROM CARDS WHERE TAG=?"
cursor.execute(q, (tag,))
cursor.execute(up, (tag,))
conn.commit()
for row in cursor.execute(id, (tag,)):
print row [1] + " has been checked " + ('in' if row[2] else 'out')
r1 = str(row[1])
r2 = str(row[2])
mseg = str(r1 + r2)
text_widget = Text(root, font='times 40 bold', bg='Green')
text_widget.pack(fill=BOTH, expand=0)
text_widget.tag_configure('tag-center', wrap='word', justify='center')
text_widget.insert(INSERT, r1 + r2, 'tag-center')
root.mainloop()
def update(self, observable, (addedcards, removedcards)):
previousIdString = ""
idString = ""
for card in addedcards:
if addedcards:
hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
assert hresult==SCARD_S_SUCCESS
hresult, readers = SCardListReaders(hcontext, [])
assert len(readers)>0
reader = readers[0]
hresult, hcard, dwActiveProtocol = SCardConnect(
hcontext,
reader,
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
hresult, response = SCardTransmit(hcard,dwActiveProtocol,[0xFF,0xCA,0x00,0x00,0x04])
v = toHexString(response, format=0)
tag = str(v)
main(tag)
cursor = conn.cursor
Wenn ich alle TK Sachen zu entfernen und Put cursor = conn.cursor
oben while True:
kann ich Scan-Karten ohne Probleme halten
def main(tag):
cursor = conn.cursor
q = "SELECT * FROM CARDS WHERE TAG=?"
up = "UPDATE CARDS SET FLAG = (CASE WHEN FLAG=0 THEN 1 ELSE 0 END) WHERE TAG=?"
id = "SELECT * FROM CARDS WHERE TAG=?"
cursor.execute(q, (tag,))
cursor.execute(up, (tag,))
conn.commit()
for row in cursor.execute(id, (tag,)):
print row [1] + " has been checked " + ('in' if row[2] else 'out')
'SQLite-Objekte, die in einem Thread erstellt wurden, können in demselben Thread verwendet werden. 'Grab output not variable! – dsgdfg
Wie in einer txt-Datei, dann lesen Sie es ein? – shaggs
Sie scheinen mehrmals "Hauptschleife" zu nennen. Warum rufst du es an, wenn 'main' gerufen wird? Es muss genau einmal für das Leben Ihres Programms aufgerufen werden.Das ist vielleicht nicht die Ursache für dieses spezielle Problem, aber es ist definitiv ein Problem. –