Ubuntu 18.04下在Workspace 1抓取Workspace 2截图的Python可行性问询
可行!分两种场景实现你的需求
针对你的Ubuntu 18.04环境(默认Xorg桌面),完全可以实现无需切换工作区抓取Workspace 2截图,以及特定事件触发切换到Workspace 2的需求,下面是具体实现方案:
一、无需切换工作区抓取Workspace 2的截图
Pyscreenshot本身默认抓取当前显示的屏幕,但结合X11桌面的虚拟桌面机制,我们可以通过工具定位Workspace 2的虚拟区域,直接抓取其内容。步骤如下:
1. 安装依赖工具
首先安装所需的命令行工具和Python库:
sudo apt update && sudo apt install wmctrl xdotool python3-pyscreenshot python3-pil
2. 获取Workspace 2的虚拟桌面信息
用wmctrl -d命令查看所有工作区的信息,输出示例:
0 * DG: 1920x1080 VP: 0,0 WA: 0,27 1920x1053 Workspace 1 1 - DG: 1920x1080 VP: 0,0 WA: 0,27 1920x1053 Workspace 2
这里1就是Workspace 2的编号(注意:工作区编号从0开始),DG是虚拟桌面的总尺寸,WA是可用区域(去掉顶部状态栏后的尺寸)。
3. Python脚本抓取Workspace 2截图
我们可以通过调用xwd(X11窗口抓取工具)获取整个虚拟桌面的内容,再用PIL裁剪出Workspace 2的区域;或者直接用Pyscreenshot结合工作区坐标抓取。下面是示例脚本:
import subprocess import pyscreenshot as ImageGrab from PIL import Image def get_workspace_geom(workspace_num): # 调用wmctrl获取工作区几何信息 result = subprocess.run(["wmctrl", "-d"], capture_output=True, text=True) lines = result.stdout.strip().split("\n") for line in lines: parts = line.split() if parts[0] == str(workspace_num): # 解析DG(虚拟桌面尺寸)和VP(偏移) dg = parts[3].split("x") return (0, 0, int(dg[0]), int(dg[1])) # 因为每个工作区是独立虚拟桌面,偏移为0,0 return None # 抓取Workspace 2(编号1)的截图 workspace_geom = get_workspace_geom(1) if workspace_geom: # 抓取整个虚拟桌面 img = ImageGrab.grab(bbox=workspace_geom) # 保存截图 img.save("workspace2_screenshot.png") print("Workspace 2截图已保存!") else: print("未找到Workspace 2")
注意:如果你的桌面环境中工作区是横向排列的,虚拟桌面的宽度可能是多个屏幕的总和,此时需要根据工作区编号计算偏移。比如两个1920x1080的屏幕,Workspace 2的偏移是1920,0,此时bbox应为(1920, 0, 3840, 1080)。
二、特定事件触发切换到Workspace 2
当需要在特定事件(比如某个函数调用、定时器触发)时切换到Workspace 2,可以用xdotool命令实现,Python中通过subprocess调用即可:
示例代码片段
import subprocess def switch_to_workspace2(): # Workspace 2的编号是1(根据wmctrl -d的输出调整) subprocess.run(["xdotool", "set_desktop", "1"], check=True) print("已切换到Workspace 2") # 模拟特定事件触发 if some_condition: # 替换为你的触发条件 switch_to_workspace2()
关键注意事项
- 确保你的Ubuntu 18.04使用的是Xorg桌面(默认是Xorg,若手动切换到Wayland,上述工具可能无法正常工作)。
- 工作区编号可能因桌面配置不同而变化,务必用
wmctrl -d确认准确编号。 - 如果遇到权限问题,确保当前用户有访问X11显示的权限(通常无需额外设置,除非是远程桌面环境)。
内容的提问来源于stack exchange,提问作者Sid




