Skip to main content
 首页 » 编程设计

python之使用 PyQT 伪透明

2025年05月04日15findumars

我想创建一个伪透明窗口,方法是使用 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(),窗口本身还是出现在屏幕截图上。我怎样才能避免这种情况?

请您参考如下方法:

这是我写的东西,基本上可以满足您的需求。它使用可调整大小的 Qt 窗口对其背后的任何内容进行屏幕截图。到目前为止,此脚本仅适用于 1 个屏幕。深入研究 QScreen 和 QApplication 可能会给您答案以使其可扩展。

import sys 
import io 
from PySide2.QtWidgets import QApplication, QWidget, QPushButton 
from PySide2.QtCore import Qt, QBuffer 
from PIL import Image 
 
 
class Screenshooter(QWidget): 
    def __init__(self, parent): 
        super().__init__() 
        self.parent = parent 
        self.setAttribute(Qt.WA_TranslucentBackground, True) 
        self.resize(640, 480) 
        self.snapBtn = QPushButton("Capture", self) 
        self.snapBtn.clicked.connect(self.take_screenshot) 
        self.show() 
 
    def take_screenshot(self): 
        geometry = self.geometry() 
        screen = self.parent.screenAt(self.pos()) 
        full_screenshot = screen.grabWindow( 
            0, 
            geometry.x(), 
            geometry.y(), 
            geometry.width(), 
            geometry.height() 
        ) 
        full_image = full_screenshot.toImage() 
        buffer = QBuffer() 
        buffer.open(QBuffer.ReadWrite) 
        full_image.save(buffer, 'PNG') 
        im = Image.open(io.BytesIO(buffer.data())) 
        im.show() 
        buffer.close() 
 
 
if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    widget = Screenshooter(app) 
    sys.exit(app.exec_())