2016-12-01 1 views
2

저는 PyQt GUI를 처음 사용합니다. 내가 QLineEdit 텍스트 상자의 데이터를 얻고 싶습니다, 그리고 그 방법은 text()입니다. 데이터를 가져 오는 중 데이터 형식은 QString입니다. json 데이터를 서버에 전송해야하는데, 그 방법으로 json.dumps() 메서드를 사용하고 있습니다.하지만 오류가 발생합니다.PyQt : 데이터가 JSON을 직렬화 할 수 없습니다

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 

오류 : 당신이 PyQt4와 PyQt5, 또는 Python3를 사용하는 경우 가능하면 PyQt는 항상 일반 파이썬 형태를 돌려주는 것이기 때문에

<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

추적 추적은 어떻습니까? – Sheena

+0

양식을 제출 중입니다. 저장 버튼을 클릭하면 Personaldata() 함수라고하는 모든 편집 상자에서 데이터를 가져와야합니다. json.dumps() 메서드에 전달할 때. 오류가 발생했습니다. –

+0

@Himanshumittal 양식에 입력하는 데이터는 무엇입니까? – eyllanesc

답변

1

, 당신은 이런 종류의 오류를받지 않습니다. 그러나 Python2와 PyQt4를 함께 사용하고 있습니다. 즉, 명시 적으로 해당 동작을 요청해야합니다.

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

을 (그리고 setapi 전화 응용 프로그램에서 어떤 PyQt는 모듈의 첫 번째 가져 오기 전에 이동해야합니다) :

다음과 같이 귀하의 수입을 변경, 그렇게합니다.

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

추신 : 그냥 파이썬 및/또는 PyQt는 학습 밖으로 시작하는 경우

, 난 강력 것 장소에두고

, 당신이 당신의 코드를 단순화해야합니다 Python3과 PyQt5를 사용하는 것이 좋습니다.

관련 문제