首页 > 编程问答 >当 python 窗口的一部分不在屏幕上时,如何让它自己被记录?

当 python 窗口的一部分不在屏幕上时,如何让它自己被记录?

时间:2024-07-26 05:34:09浏览次数:8  
标签:python windows pyqt

在 Windows 10 中,大多数应用程序窗口都可以使用 OBS 等程序进行记录。

当窗口被拖动以致其部分内容在显示屏上不可见时,通常 OBS 仍会接收窗口的内容,即使它在屏幕上不可见。

但是,在编写 python 应用程序时,这似乎不以相同的方式工作。

我尝试了几种不同的类似 GUI 的模块进行测试,例如 PyQt6。 以下代码仅创建一个闪烁黑白的窗口。

    from PyQt6.QtWidgets import QApplication, QWidget
    from PyQt6.QtCore import QTimer
    
    app = QApplication([])
    window = QWidget()
    window.setStyleSheet("background-color: white;")
    window.show()
    
    def toggle_color():
        current_color = window.styleSheet()
        new_color = "background-color: black;" if current_color == "background-color: white;" else "background-color: white;"
        window.setStyleSheet(new_color)
    
    timer = QTimer()
    timer.timeout.connect(toggle_color)
    timer.start(500)
    
    app.exec()

当此代码运行并记录该窗口时,并且该窗口的一部分被拖离屏幕,它会创建屏幕撕裂,并且该窗口的任何部分离屏不会更新。 用 OBS 录制时出现屏幕撕裂

我最初认为这是由于模块本身及其处理方式造成的,但现在我相信这是 python 方式的一个更根本的问题创建窗口并发送数据。

我的问题本质上是是否有任何方法可以改变其性质,以便可以记录Python创建的整个窗口,无论是否在屏幕外(与大多数其他程序类似)。


你观察到的行为是由于 PyQt6(以及一般的 Qt)渲染窗口的方式造成的,而不是 Python 本身。

Qt 以及其他许多 GUI 工具包,都使用一种叫做 组合窗口管理 的技术。这意味着应用程序在屏幕外的缓冲区中“绘制”其窗口内容,然后窗口管理器(在本例中是 Windows 10)将该缓冲区作为一个整体“组合”到屏幕上。

当窗口的部分内容在屏幕外时,PyQt6 不会绘制离屏区域,因为它认为这是不必要的并且可以节省资源。因此,当使用 OBS 之类的屏幕录制软件时,它只会捕获实际绘制的内容,从而导致看到的“撕裂”效果。

解决方案:

不幸的是,没有直接的方法可以强制 PyQt6 始终绘制屏幕外区域。但是,可以尝试一些解决方法:

  1. 使用基于 GPU 的渲染: 启用基于 GPU 的渲染可以提高性能,并且在某些情况下可以解决此问题。可以尝试在代码中添加以下行:
from PyQt6.QtWidgets import QApplication

QApplication.setAttribute(Qt.AA_UseOpenGLES)
  1. 使用虚拟显示器: 创建一个虚拟显示器,其分辨率大于的物理显示器。这将为的应用程序提供更大的画布,即使窗口的一部分在屏幕外,它也会被完全绘制。然后,可以使用 OBS 录制虚拟显示器。

  2. 使用不同的屏幕录制软件: 某些屏幕录制软件可能能够处理这种情况并正确捕获窗口,即使它部分位于屏幕外。可能需要尝试不同的软件,例如:

    • OBS Studio(使用“窗口捕获”源并启用“捕获窗口外的游标和点击”选项)
    • Camtasia
    • Bandicam
  3. 更改应用程序逻辑: 如果可能的话,更改应用程序逻辑以避免窗口的一部分位于屏幕外。例如,可以实现一个最大化按钮,该按钮将窗口调整为适合屏幕,或者在窗口移动到屏幕边界之外时调整窗口大小。

请记住,这些解决方法可能并不适用于所有情况,具体取决于的应用程序的具体要求和系统配置。

标签:python,windows,pyqt
From: 78795484

相关文章