【问题标题】:PySide2: TypeError: 'bytes' object cannot be interpreted as an integerPySide2:TypeError:“字节”对象不能解释为整数
【发布时间】:2018-09-12 09:13:44
【问题描述】:

我有这个 PySide2 代码,它可以在带有 Python 2.7 的 Linux 上运行

from PySide2.QtCore import QBuffer, QByteArray

...

image = self.clipboard.image()
ba = QByteArray()
buffer = QBuffer(ba)
buffer.open(QIODevice.WriteOnly)
image.save(buffer, "PNG")
return bytes(buffer.data())

但在带有 Python 3.6 的 Windows 上,它在这里失败了:

  File "C:\....foo.py", line 93, in image_to_png
    return bytes(buffer.data())

例外:

TypeError: 'bytes' object cannot be interpreted as an integer

以字节形式获取 PNG 的最简单方法是什么?

我想避免创建一个临时文件,因为这个上下文不需要它。

(我使用 PySide2,但如果您认为它更有意义,我可以切换到不同的 python-QT 绑定。如果您认为,请发表评论)

【问题讨论】:

  • 您只是将旧代码转换为在 Python 3 上运行,还是需要同时在 2.7 和 3.6 上运行?
  • 在 Python 3.6 上,buffer.data() 的类型是什么?
  • @PM2Ring 到目前为止,相同的代码库适用于 2.7 和 3.6。如果能保持这种状态(至少几个月),那就太好了。

标签: python pyqt pyside pyside2


【解决方案1】:

看起来QBuffer.data() 返回类型是QByteArray(可能无法由bytes() 构造函数处理),但是QByteArray.data() 返回类型是bytes。所以,我认为你应该尝试return buffer.data().data() 而不是return bytes(buffer.data())

【讨论】:

  • 我认为在线文档在这种情况下是不正确的,因为它表明str作为QByteArray.data()的返回类型:link
【解决方案2】:

这是一种解决方法。

def image_to_png(image):
    temp_png = tempfile.mktemp('.png')
    image.save(temp_png)
    with io.open(temp_png, 'rb') as fd:
        content = fd.read()
    os.unlink(temp_png)
    return content

如果可能,我想避免使用临时文件。欢迎使用其他解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2017-08-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2015-03-18
    相关资源
    最近更新 更多