2016-04-14 12 views
0

イム。私がseccond時間をスキャンすると、私にはエラーが発生します。表示SQLiteの出力

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) 

更新以下

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 

メインコード:私は以下の回答から は以下になりました疲れています。

conn.cursorをクラスに移動しましたが同じです。別のエラーが

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) 

はまた、私はすべてのTKのものを削除し、while True:cursor = conn.cursorを置けば、私は問題なくスキャンカードを保つことができ、メインと更新が、それでも同じエラー

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 

に疲れ入れてありCoursor is not definedています

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') 
+0

'スレッド内で作成されたSQLiteオブジェクトは、同じスレッドで使用できます.'出力は変数ではありません! – dsgdfg

+0

それをtxtファイルに入れておけば、それを読み取ることができますか? – shaggs

+0

あなたは 'mainloop'を複数回呼び出すようです。 'main'が呼び出されるたびに、なぜあなたはそれを呼び出していますか?あなたのプログラムの寿命のために一度だけ呼び出される必要があります。それはこの特定の問題の原因ではないかもしれませんが、間違いなく問題です。 –

答えて

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

class printobserver(CardObserver)は、新しいスレッドを作成する必要があります。sqlite3では、並行性はほとんどサポートされていません。しかし、それは異なるプロセス間で行います。あなたのコードからこのスニップに注意してください:

printobserver

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() 

グローバル名前空間while-loop

cardobserver = printobserver() 
cardmonitor.addObserver(cardobserver) 
cardmonitor.deleteObserver(cardobserver) 

printobserverオブジェクトからmain()を呼び出しているため(このオブジェクトが毎回新しいスレッドを作成していることがわかっている)、グローバル名前空間のメインスレッドでcursorを生成し、カーソルをmain()内に呼び出すと、スレッド、このエラーが表示されます。

あなたはmain()から外部cursorを使用していないので、私はあなたがする必要があるものは何でもやって、その後、cursorを初期化し、main()の上部にあるデータベースに接続し、メインの下部にあるデータベースからの切断をお勧めします。あるいは、カーソルの初期化が依然としてmain()と同じスレッド内にあるので、printobserverオブジェクト内でこれを行うことができます。

関連する問題