Python 用PyQT实现伪透明

Python 用PyQT实现伪透明,python,pyqt,transparency,screenshot,Python,Pyqt,Transparency,Screenshot,我想通过截图来创建一个伪透明窗口,截图显示如果没有PyQt,窗口后面会是什么。以下代码截图: #!/usr/bin/python3 from PyQt4.QtGui import * app = QApplication([]) widget = QWidget() widget.setLayout(QVBoxLayout()) label = QLabel() widget.layout().addWidget(label) def shoot(): geometry = wid

我想通过截图来创建一个伪透明窗口,截图显示如果没有PyQt,窗口后面会是什么。以下代码截图:

#!/usr/bin/python3

from PyQt4.QtGui import *

app = QApplication([])
widget = QWidget()
widget.setLayout(QVBoxLayout())
label = QLabel()
widget.layout().addWidget(label)

def shoot():
    geometry = widget.geometry()
    widget.hide()
    label.setPixmap(QPixmap.grabWindow(QApplication.desktop().winId(), x = geometry.x(), y = geometry.y(), height = geometry.height(), width = geometry.width())
    widget.show()

widget.layout().addWidget(QPushButton('Screenshot', clicked = shoot))
widget.show()
app.exec_()

但是,尽管有widget.hide(),窗口本身也会出现在屏幕截图上。我怎样才能避免这种情况呢?

我认为,与其睡一段未知的时间,
app.processEvents()
也应该起作用。这迫使Qt应用程序在继续之前完成正在进行的工作,比如隐藏小部件。这是一个相关的问题,在其中一个答案中对此进行了讨论。

这里是我写的一些东西,基本上满足了您的需求。它使用可调整大小的Qt窗口来截屏它背后的任何东西。到目前为止,此脚本仅适用于1个屏幕。潜入
QScreen
QApplication
可能会为您提供使此可扩展的答案

导入系统 输入io 从PySide2.QtWidgets导入QApplication、QWidget、QPushButton 从PySide2.QtCore导入Qt、QBuffer 从PIL导入图像 类屏幕截图(QWidget): 定义初始化(自身,父级): super()。\uuuu init\uuuuu() self.parent=parent self.setAttribute(Qt.WA_半透明背景,真) 自我调整大小(640480) self.snapBtn=QPushButton(“捕获”,self) self.snapBtn.clicked.connect(self.take\u屏幕截图) self.show() def take_屏幕截图(自我): geometry=self.geometry() screen=self.parent.screenAt(self.pos()) 完整屏幕截图=screen.grabWindow( 0, geometry.x(), geometry.y(), geometry.width(), 几何体高度() ) full_image=full_屏幕截图 buffer=QBuffer() buffer.open(QBuffer.ReadWrite) 完整图像。保存(缓冲区“PNG”) im=Image.open(io.BytesIO(buffer.data())) im.show() buffer.close() 如果名称=“\uuuuu main\uuuuuuuu”: app=QApplication(sys.argv) 小部件=屏幕截图(应用程序) sys.exit(app.exec_())
您是否尝试在
widget.hide()
和设置标签的Pixmap之间等待(
time.sleep()
)一段时间?当你拍摄截图时,可能小部件还没有隐藏。或者,您是否使用
widget.setAttribute(Qt.WA_TranslucentBackground,True)
尝试过实际的透明度?谢谢,如果我在widget.hide()之后添加0.3秒的睡眠,它实际上是有效的。但是我怎么知道还要等多久呢?是否有一种方法可以简单地等待隐藏事件完成?似乎processEvents()的持续时间不够长。我还尝试了self.ishiden()==False:sleep(0.1),但这也没有等待足够长的时间。窗口有点闪烁,但是屏幕截图没有显示它后面的桌面。