我正在使用 PySide2 在 Python 上开发一个 gui 应用程序。我正在使用 fromWinId 和 createWindowContainer 函数在我的应用程序中嵌入外部窗口应用程序。它在 Windows 上完美运行,我可以访问我的嵌入式应用程序(例如 Paint 应用程序)。但在 Linux 上,它的工作方式不同。我设法获取了外部应用程序的窗口 ID 并将其嵌入到我的应用程序中,但是当它被嵌入时,我只有外部应用程序的冻结图像。
这是我的代码:
import Xlib.display
from PySide2.QtGui import QWindow
from PySide2.QtWidgets import QWidget, QApplication, QPushButton, QMainWindow, QVBoxLayout
def _get_window_id_win32(title):
import win32gui
return win32gui.FindWindow(None, title)
def get_window_id_linux(name):
display = Xlib.display.Display()
root = display.screen().root
window_ids = root.get_full_property(display.intern_atom("_NET_CLIENT_LIST"), Xlib.X.AnyPropertyType).value
for window_id in window_ids:
window = display.create_resource_object("window", window_id)
window_name = window.get_wm_name()
if window_name and name in window_name:
return window_id
def run_app(window_id):
app = QApplication([])
main = QMainWindow()
widget_central = QWidget()
layout = QVBoxLayout()
button = QPushButton()
button.setText('CLICK')
layout.addWidget(button)
window = QWindow.fromWinId(window_id)
widget = QWidget.createWindowContainer(window)
layout.addWidget(widget)
widget_central.setLayout(layout)
main.setCentralWidget(widget_central)
main.show()
app.exec_()
if __name__ == "__main__":
window_id = get_window_id_linux("Window Title") # REPLACE 'Window Title' by the title of the window you want to embed
# window_id = _get_window_id_win32('Window Title') IF YOU WANT TO TEST ON WINDOWS
if window_id:
run_app(window_id)