我正在开发一款适用于 Ubuntu 的 Python 应用程序,让用户无需图形驱动程序即可获得所需的分辨率。
为了实现这一点,我一直在使用xrandr
,到目前为止,它非常有用
但是,我现在遇到了一个问题:如何检测监视器名称?我原本打算通过 来使用终端命令os.system
,修改终端输出以获取所需的监视器输出,然后将其存储在程序中。不幸的是,尽管我搜索了很多次,但我还是无法找到如何做到这一点。
有什么方法可以做到这一点?
把它们加起来:我正在寻找一个可以给我显示器名称的终端命令,VGA1
例如DVI-0
答案1
我不确定你将如何在你的申请中运用它(“使用户无需图形驱动程序即可获得所需的分辨率”?), 但:
用于列出已连接屏幕的终端命令
xrandr | grep " connected " | awk '{ print$1 }'
这将为您提供连接的屏幕以供进一步处理,例如:
VGA-0
DVI-I-1
由于您提到了 python,下面的代码片段也会列出连接的屏幕:
#!/usr/bin/env python3
import subprocess
def screens():
output = [l for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()]
return [l.split()[0] for l in output if " connected " in l]
print(screens())
这还将为您提供连接的屏幕,例如:
['VGA-0', 'DVI-I-1']
笔记
" connected "
请注意搜索字符串周围的空格。它们是用来防止不匹配的disconnected
。
编辑2019
xrandr
使用 python,根本不需要使用或任何其他系统调用。最好使用 Gdk:
#!/usr/bin/env python3
import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk
allmonitors = []
gdkdsp = Gdk.Display.get_default()
for i in range(gdkdsp.get_n_monitors()):
monitor = gdkdsp.get_monitor(i)
scale = monitor.get_scale_factor()
geo = monitor.get_geometry()
allmonitors.append([
monitor.get_model()] + [n * scale for n in [
geo.x, geo.y, geo.width, geo.height
]
])
print(allmonitors)
示例输出:
[['eDP-1', 0, 0, 3840, 2160], ['DP-2', 3840, 562, 1680, 1050]]
根据所需信息,你可以选择https://lazka.github.io/pgi-docs/Gdk-3.0/classes/Monitor.html
答案2
您可以将 bash 命令与 popen 一起使用:
import os
list_display = os.popen("xrandr --listmonitors | grep '*' | awk {'print $4'}").read().splitlines()
# or based on the comment of this answer
list_display = os.popen("xrandr --listmonitors | grep '+' | awk {'print $4'}").read().splitlines()
xrandr --listmonitors | grep '*' | awk {'print $4'}
xrandr --listmonitors | grep '+' | awk {'print $4'}
或者我写过一篇关于这个主题的旧文章 https://gist.github.com/antoinebou12/7a212ccd84cc95e040b2dd0e14662445
答案3
您可以使用python
和来python
获取连接的显示器名称:
$ python3 -c 'from gi.repository import Gdk; screen=Gdk.Screen.get_default(); \
[print(screen.get_monitor_plug_name(i)) for i in range(screen.get_n_monitors())]'
DP1
LVDS1
答案4
由于我无法添加评论,因此我必须添加完整的答案。很抱歉。
用于列出已连接屏幕的终端命令
xrandr | grep “已连接” | awk'{print$1}'
只需进行一点小调整:
awk '/\<connected\>/ {print $1}'< <(xrandr)
或者
xrandr | awk '/\<connected\>/ {print $1}'
awk
在正斜杠内搜索模式/
并打印第一列。