Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python `mime.hasImage()`在Linux上返回'true',但'mime.imageData()`返回'None'_Python_Linux_Pyqt_Pyqt5 - Fatal编程技术网

Python `mime.hasImage()`在Linux上返回'true',但'mime.imageData()`返回'None'

Python `mime.hasImage()`在Linux上返回'true',但'mime.imageData()`返回'None',python,linux,pyqt,pyqt5,Python,Linux,Pyqt,Pyqt5,我正在尝试在Linux上运行一个简单的PyQt5应用程序,代码如下: #/usr/bin/python 导入系统 从PyQt5.QtWidgets导入QApplication,QWidget def main(): app=QApplication(sys.argv) w=QWidget() w、 调整大小(250150) w、 移动(300300) w、 setWindowTitle(“简单”) w、 show() mime=app.clipboard().mimeData() 打印(mime

我正在尝试在Linux上运行一个简单的PyQt5应用程序,代码如下:

#/usr/bin/python
导入系统
从PyQt5.QtWidgets导入QApplication,QWidget
def main():
app=QApplication(sys.argv)
w=QWidget()
w、 调整大小(250150)
w、 移动(300300)
w、 setWindowTitle(“简单”)
w、 show()
mime=app.clipboard().mimeData()
打印(mime.hasImage())#真
打印(mime.imageData())#无
sys.exit(app.exec_())
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
在运行它之前,我将一个图像复制到剪贴板中,因此
mime.hasImage()
应该返回
True
。没问题,也是这样。但奇怪的是,
mime.imageData()
有时返回
None
。这不应该发生
mime.imageData()
应该包含我复制的图像,而不是
None
。代码有什么问题吗

顺便说一句,这似乎只发生在Linux上,
mime.imageData()
在Windows上永远不会返回
None
。我使用的是python3

hasImage()
返回True并不意味着
imageData()
返回一个QImage,因为它只表示用户将图像复制到剪贴板,我应该以什么格式复制图像?它可以是png、jpg等,也可以提供url供客户端应用程序下载,或者提供html将其插入客户端应用程序,然后通过呈现html获得图像

因此,一般来说,从中复制图像的应用程序负责发送格式,并且该格式没有限制性标准,但存在通用格式

以下示例显示了处理来自URL和HTML的图像的逻辑:

#/usr/bin/python
导入系统
从functools导入缓存的_属性
从PyQt5.QtCore导入pyqtSignal、QObject、QUrl
从PyQt5.QtNetwork导入QNetworkAccessManager、QNetworkRequest、QNetworkReply
从PyQt5.QtGui导入QGuiApplication、QImage、QPixmap
从PyQt5.qtwidts导入QApplication、QWidget、QLabel
从bs4导入BeautifulSoup
类ImageDownloader(QObject):
完成=PYQT信号(QImage)
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.manager.finished.connect(self.handle\u finished)
@缓存的不动产
def经理(自我):
返回QNetworkAccessManager()
def start_下载(自我,url):
self.manager.get(QNetworkRequest(url))
def句柄_完成(自我,回复):
if reply.error()!=QNetworkReply.NoError:
打印(“错误:,reply.errorString())
返回
image=QImage()
image.loadFromData(reply.readAll())
self.finished.emit(图像)
类剪贴簿管理器(QObject):
imageChanged=pyqtSignal(QImage)
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
QGuiApplication.clipboard().dataChanged.connect(
self.handle\u剪贴板\u数据已更改
)
self.downloader.finished.connect(self.imageChanged)
@缓存的不动产
def下载器(自身):
返回ImageDownloader()
def句柄\u剪贴板\u数据更改(自身):
mime=QGuiApplication.clipboard().mimeData()
如果mime.hasImage():
image=mime.imageData()
如果图像不是无:
self.imageChanged.emit(图像)
elif mime.hasUrls():
url=mime.url()[0]
self.downloader.start\u下载(URL[0])
elif mime.hasHtml():
html=mime.html()
soup=BeautifulSoup(html,features=“lxml”)
imgs=soup.findAll(“img”)
如果imgs:
url=QUrl.fromUserInput(imgs[0][“src”])
self.downloader.start\u下载(url)
其他:
对于mime.formats()中的fmt:
打印(fmt,mime.data(fmt))
def main():
app=QApplication(sys.argv)
label=QLabel(scaledContents=True)
标签。调整大小(250150)
标签。移动(300300)
label.setWindowTitle(“简单”)
label.show()
manager=ClipboardManager()
manager.imageChanged.connect(
lambda image:label.setPixmap(QPixmap.fromImage(image))
)
sys.exit(app.exec_())
如果名称=“\uuuuu main\uuuuuuuu”:
main()

您从何处复制图像?
mime.urls()
返回什么?@eyllansc谢谢你的提示。我从谷歌chrome(谷歌图片网页)复制了这张图片
mime.urls()
始终返回正确的值,例如
[PyQt5.QtCore.QUrl('https://www.lotus-qa.com/wp-content/uploads/2020/02/testing.jpg”)]
。我还注意到,对于同一个图像,有时
mime.imageData()
返回
None
,有时则不返回(即,有时确实有效)。我不知道为什么。在我的回答中,我添加了一个逻辑,如果没有图像,那么使用url下载它。为了测试我的示例,启动应用程序,然后复制图像,使其显示在窗口中。谢谢,但这个答案似乎并不能完全解决问题。我遇到了一个看似不可能的情况:在复制图像之后,
mime.hasImage()
True
mime.imageData()
None
mime.hasUrls()
False
mime.urls()。换句话说,
PyQt
告诉我它有图像,但我无法从中获取该图像。并非所有图像都是这样,只有一些图像会产生此问题,例如此图像:。顺便说一下,我知道该图像已成功复制到剪贴板,因为我可以在Linux上使用
xclip
通过以下命令为我提取该图像:
xclip-selection clipboard-t image/png-o>~/Downloads/test.png
@Searene查看我的更新答案真的很有效,非常感谢!!!