2016-04-14 9 views
0

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

'SQLite-Objekte, die in einem Thread erstellt wurden, können in demselben Thread verwendet werden. 'Grab output not variable! – dsgdfg

+0

Wie in einer txt-Datei, dann lesen Sie es ein? – shaggs

+0

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. –

Antwort

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) muss einen neuen Thread erstellen, sqlite3 unterstützt nicht viel Nebenläufigkeit. Es funktioniert jedoch über verschiedene Prozesse hinweg. Beachten Sie diese Schnipsel aus dem Code:

Printobserver

main(tag) 

Haupt

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

globalen Namensraum while-loop

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

Da Sie main() von Ihrem Objekt printobserver aufrufen (dieses Objekt erstellt offensichtlich jedes Mal einen neuen Thread), haben Sie cursor im Hauptthread im globalen Namespace erzeugt, und Sie rufen den Cursor innerhalb von main() auf, der jetzt von einem neuen Thread ausgeführt wird Thread, Sie erhalten diesen Fehler.

Da Sie die cursor von main() extern nicht verwenden, empfehle ich an der Spitze der main() die Verbindung zur Datenbank, die cursor Initialisierung, dann tun, was Sie tun müssen, und am unteren Rande des Hauptes aus der Datenbank zu trennen. Alternativ können Sie dies innerhalb des Objekts printobserver tun, da die Cursor-Initialisierung immer noch im selben Thread wie main() ist.