2016-12-01 2 views
2

Ich bin neu in PyQt GUI. Ich möchte die Daten eines QLineEdit Textfelds abrufen, und dafür verwende ich die text() Methode. Ich bekomme die Daten, aber der Datentyp ist ein QString. Ich muss dies als JSON-Daten an einen Server übertragen, und dafür verwende ich die json.dumps() Methode - aber ich bekomme einen Fehler.PyQt: Daten sind nicht JSON serialisierbar

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import pygame.camera 
import pygame.image 
import json 

app = QApplication(sys.argv) 

class stackedExample(QWidget): 

    def __init__(self): 
     super(stackedExample, self).__init__() 
     self.current_module = 'GUI' 
     print (self.current_module) 

     self.takeFinger = False 

     self.personaldata = None 
     self.vehicledata = None 

     self.leftlist = QListWidget() 
     self.leftlist.insertItem (0, 'Personal Info') 

     self.stack1 = QWidget() 

     self.stack1UI() 

     self.Stack = QStackedWidget (self) 
     self.Stack.addWidget (self.stack1) 

     hbox = QHBoxLayout(self) 
     hbox.addWidget(self.leftlist) 
     hbox.addWidget(self.Stack) 

     self.setLayout(hbox) 
     self.leftlist.currentRowChanged.connect(self.display) 
     self.setGeometry(450, 120, 30,30) 

     self.show() 
     sys.exit(app.exec_()) 
     print "2" 

    def stack1UI(self): 
     layout = QFormLayout() 
     self.s1 = QLabel("System ID") 
     self.s1_val = QLineEdit() 
     layout.addRow(self.s1,self.s1_val) 
     self.s2 = QLabel("Driver Name") 
     self.s2_val = QLineEdit() 
     layout.addRow(self.s2,self.s2_val) 
     self.s3 = QLabel("Aadhar ID") 
     self.s3_val = QLineEdit() 
     layout.addRow(self.s3,self.s3_val) 

     self.s4 = QLabel("Driver Phone") 
     self.s4_val = QLineEdit() 
     layout.addRow(self.s4,self.s4_val) 

     self.s5 = QLabel("Age") 
     self.s5_val = QLineEdit() 
     layout.addRow(self.s5,self.s5_val) 

     sex = QHBoxLayout() 
     sex.addWidget(QRadioButton("Male")) 
     sex.addWidget(QRadioButton("Female")) 
     layout.addRow(QLabel("Sex"),sex) 
     self.b4 = QPushButton("&Save") 
     self.b4.setDefault(True) 
     self.b4.clicked.connect(self.personalData) 
     layout.addWidget(self.b4) 
     self.stack1.setLayout(layout) 

    def personalData(self): 
     print (self.s1_val.toPlainText()) 
     print type(self.s1_val.text()) 
     if (self.s1_val.text().isEmpty()): 
     print "s1 is empty" 
     #self.popup_window() 
     if (self.s2_val.text().isEmpty()): 
     print "s2 is empty" 
     if (self.s3_val.text().isEmpty()): 
     print "s3 is empty" 
     if (self.s4_val.text().isEmpty()): 
     print "s4 is empty" 
     if (self.s5_val.text().isEmpty()): 
     print "s5 is empty" 

     if(not self.s1_val.text().isEmpty() and not self.s2_val.text().isEmpty()): 
     #Data1 = {'systemID':self.s1_val.text(),'driverName': self.s2_val.text(),'aadharID': self.s3_val.text(),'driverPhone': self.s4_val.text(),'Age': self.s5_val.text()} 
     Data1 = {'systemID': self.s1_val.toPlainText()} 
     self.personaldata = json.dumps(self.s1_val.text()) 
     print ("personal json ready") 

    def display(self,i): 
     self.Stack.setCurrentIndex(i) 

    def on_takephoto(self): 
     self.showImage('photo.jpg') 
    def getFinger(self): 
     return self.takeFinger 
    def setFinger(self): 
     self.takeFinger = True 

Der Fehler ist:

<class 'PyQt4.QtCore.QString'> 
    Traceback (most recent call last): 
     File "/home/hearthacker/Desktop/gui code sagar/stacked.py", line 138, in personalData 
     self.personaldata = json.dumps(self.s1_val.text()) 
     File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps 
     return _default_encoder.encode(obj) 
     File "/usr/lib/python2.7/json/encoder.py", line 207, in encode 
     chunks = self.iterencode(o, _one_shot=True) 
     File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode 
     return _iterencode(o, 0) 
     File "/usr/lib/python2.7/json/encoder.py", line 184, in default 
     raise TypeError(repr(o) + " is not JSON serializable") 
    TypeError: PyQt4.QtCore.QString(u's') is not JSON serializable 
+0

Wie wäre es mit einem Traceback? – Sheena

+0

Ich reiche ein Formular ein. Wenn ich auf Speichern klicke, muss ich die Daten aus allen Bearbeitungsfeldern für die Personaldata() -Funktion abrufen. Wenn ich es in json.dumps() -Methode übergeben. Ich habe den Fehler .. –

+0

@Himanshumittal Was sind die Daten, die Sie auf Ihrem Formular platzieren? – eyllanesc

Antwort

1

Wenn Sie PyQt5 verwenden oder Python3 mit PyQt4, werden Sie nicht diese Art von Fehler bekommen, weil PyQt immer gewöhnliche Python-Typen zurückgeben, wenn möglich. Aber Sie verwenden Python2 mit PyQt4, was bedeutet, dass Sie dieses Verhalten explizit anfordern müssen.

, das zu tun, Ihre Importe wie folgt ändern:

import sip 
sip.setapi('QString', 2) 
sip.setapi('QVariant', 2) 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

(Und beachten Sie, dass die setapi Anrufe vor der ersten Einfuhr eines PyQt Module in der Anwendung gehen müssen).

, die mit an Ort und Stelle, müssen Sie auch Ihren Code, dies zu vereinfachen:

def personalData(self): 
     print type(self.s1_val.text()) 
     if not self.s1_val.text(): 
     print "s1 is empty" 
     #self.popup_window() 
     if not self.s2_val.text(): 
     print "s2 is empty" 
     if not self.s3_val.text(): 
     print "s3 is empty" 
     if not self.s4_val.text(): 
     print "s4 is empty" 
     if not self.s5_val.text(): 
     print "s5 is empty" 

     if self.s1_val.text() and self.s2_val.text(): 
     Data1 = {'systemID': self.s1_val.text()} 
     self.personaldata = json.dumps(Data1) 
     print ("personal json ready") 

PS:

Wenn Sie Python lernen gerade erst anfangen und/oder PyQt, würde ich stark empfehlen, dass Sie Python3 und PyQt5 wenn möglich verwenden.

Verwandte Themen