【问题标题】:PyQt : data is not JSON serializablePyQt:数据不是 JSON 可序列化的
【发布时间】:2016-12-01 06:08:32
【问题描述】:

我是 PyQt GUI 的新手。我想获取QLineEdit 文本框的数据,为此我使用text() 方法。我正在获取数据,但数据类型是QString。我需要将此作为 json 数据传输到服务器,为此我使用 json.dumps() 方法 - 但我收到错误消息。

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

错误是:

    <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

【问题讨论】:

  • 回溯怎么样?
  • 我正在提交表格。当我点击保存按钮时,我必须从所有编辑框中获取我称为 Personaldata() 函数的数据。当我将它传递给 json.dumps() 方法时。我得到了错误..
  • @Himanshumittal 您在表单上放置的数据是什么?
  • 我正在放置随机数据..就像错误一样,您可以看到一个字符“s”,下一行显示它的数据类型,它是一个类
  • 你有一个 QString,你应该有一个 str。由于您也在使用 Python 2.7,问题可能是您使用 unicode 作为文本输入?所以要么用 str(..) 包围你的 .text() 调用,要么阅读更多关于它的信息 (some documentation),或者使用 Python 3 和 PyQt5(它们绝对没有这个问题)。

标签: json python-2.7 pyqt4 qstring


【解决方案1】:

如果你使用 PyQt5,或者 Python3 和 PyQt4,你不会得到这种错误,因为 PyQt 总是会尽可能返回普通的 Python 类型。但是您将 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")

PS:

如果您刚开始学习 Python 和/或 PyQt,我强烈建议您尽可能使用 Python3 和 PyQt5。

【讨论】:

    猜你喜欢
    • 2019-10-09
    • 2015-03-03
    • 2013-04-26
    • 2014-12-26
    • 1970-01-01
    • 2015-01-07
    • 2019-07-05
    相关资源
    最近更新 更多