在 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 始终绘制屏幕外区域。但是,可以尝试一些解决方法:
- 使用基于 GPU 的渲染: 启用基于 GPU 的渲染可以提高性能,并且在某些情况下可以解决此问题。可以尝试在代码中添加以下行:
from PyQt6.QtWidgets import QApplication
QApplication.setAttribute(Qt.AA_UseOpenGLES)
-
使用虚拟显示器: 创建一个虚拟显示器,其分辨率大于的物理显示器。这将为的应用程序提供更大的画布,即使窗口的一部分在屏幕外,它也会被完全绘制。然后,可以使用 OBS 录制虚拟显示器。
-
使用不同的屏幕录制软件: 某些屏幕录制软件可能能够处理这种情况并正确捕获窗口,即使它部分位于屏幕外。可能需要尝试不同的软件,例如:
- OBS Studio(使用“窗口捕获”源并启用“捕获窗口外的游标和点击”选项)
- Camtasia
- Bandicam
-
更改应用程序逻辑: 如果可能的话,更改应用程序逻辑以避免窗口的一部分位于屏幕外。例如,可以实现一个最大化按钮,该按钮将窗口调整为适合屏幕,或者在窗口移动到屏幕边界之外时调整窗口大小。
请记住,这些解决方法可能并不适用于所有情况,具体取决于的应用程序的具体要求和系统配置。
标签:python,windows,pyqt From: 78795484