我正在尝试从我的数据库中获取一行,如果1显示在tk文本小部件上,如果是0,则从显示中删除。在
我到目前为止的代码显示了一张卡的行。当我扫描秒时,我得到一个错误。在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 (most recent call last):
File "C:\rfid\main2.py", line 66, in
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
主代码如下
^{pr2}$
更新:
从下面的答案,我现在已经厌倦了下面的内容。在
感动连接光标但还是一样。不同的错误是Coursor is not definedimport 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 )
也累了放在主和更新,但还是一样的错误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
如果我去掉所有的TK内容并把cursor = conn.cursor放在while True:上面,我就可以继续扫描卡片,没有问题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')