编辑2019

编辑2019

我正在开发一款适用于 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在正斜杠内搜索模式/并打印第一列。

相关内容