我試着從我的數據庫獲取一行,顯示在TK文本組件如果爲1,並從顯示中刪除,如果0顯示SQLite的輸出
我到目前爲止的代碼顯示了一行一卡。當我第二次掃描時,我得到一個錯誤。
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
下面
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)
更新主要代碼: 從下面我的答案現在已經厭倦了下面。
將conn.cursor移入類中,但是相同。不同的錯誤是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)
也有疲憊的投入主要和更新,但還是同樣的錯誤
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
如果我刪除所有的傳統知識的東西,並把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')
'在一個線程中創建的SQLite對象可以在同一個線程中使用.'抓取輸出不可變! – dsgdfg
就像把它放到一個txt文件然後讀入它? – shaggs
你好像多次調用'mainloop'。爲什麼每次調用'main'時都會調用它?它只需要在程序的整個生命週期中調用一次。這可能不是這個具體問題的原因,但這絕對是一個問題。 –