Ich arbeite an der Entwicklung einer Python-Anwendung für Ubuntu, die es einem Benutzer ermöglicht, die gewünschte Auflösung zu haben, ohne Grafiktreiber zu benötigen.
Dazu habe ich xrandr
verwendet , was bisher ziemlich nützlich war
Allerdings habe ich jetzt ein Problem; Wie kann ich den Monitornamen erkennen? Ich hatte vor, einen Terminalbefehl über os.system
zu verwenden , ändern Sie die Terminalausgabe, um die erforderliche Monitorausgabe zu erhalten, und speichern Sie sie dann im Programm. Leider konnte ich trotz langer Suche nicht herausfinden, wie ich das bewerkstelligen kann.
Gibt es eine Möglichkeit, dies zu tun?
Um es zusammenzufassen:Ich suche nach einem Terminalbefehl, der mir den Monitornamen gibt, z. B. VGA1
oder DVI-0
Akzeptierte Antwort:
Ich bin mir nicht sicher, wie Sie es in Ihrer Anwendung anwenden werden („einem Benutzer ermöglichen, die gewünschte Auflösung zu haben, ohne dass Grafiktreiber erforderlich sind“ ?), aber:
Ein Terminalbefehl zum Auflisten verbundener Bildschirme
xrandr | grep " connected " | awk '{ print$1 }'
Dadurch erhalten Sie die verbundenen Bildschirme zur weiteren Bearbeitung, wie:
VGA-0
DVI-I-1
Da Sie Python erwähnen, listet das folgende Snippet auch verbundene Bildschirme auf:
#!/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())
Dadurch erhalten Sie auch die verbundenen Bildschirme, wie:
['VGA-0', 'DVI-I-1']
Hinweis
Beachten Sie die Leerzeichen um " connected "
in der gesuchten Zeichenfolge. Sie werden benötigt, um Konflikte mit disconnected
zu verhindern .
BEARBEITEN 2019
Bei Verwendung von Python ist die Verwendung von xrandr
nicht erforderlich oder irgendein anderer Systemaufruf überhaupt. Verwenden Sie besser 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)
Beispielausgabe:
[['eDP-1', 0, 0, 3840, 2160], ['DP-2', 3840, 562, 1680, 1050]]
Abhängig von den gewünschten Informationen können Sie Ihre Auswahl unter https://lazka.github.io/pgi-docs/Gdk-3.0/classes/Monitor.html
treffen