Python 用PyQT实现伪透明
我想通过截图来创建一个伪透明窗口,截图显示如果没有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
#!/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),但这也没有等待足够长的时间。窗口有点闪烁,但是屏幕截图没有显示它后面的桌面。