Wie es funktioniert
Das folgende Skript misst die Größe eines Bereichs zwischen zwei Positionen des Mauszeigers.
Es funktioniert wie folgt:
Positionieren Sie den Mauszeiger an der ersten Position (ohne zu klicken)
Drücken Sie die Tastenkombination Ihrer Wahl (siehe weiter unten)
Platziere die Maus in der zweiten Position (wieder ohne zu klicken)
Drücken Sie erneut Ihre Tastenkombination. Eine Benachrichtigung informiert Sie über die genaue Größe (px) des Bereichs.
Optionen
Sie können wählen (indem Sie eine der Zeilen auskommentieren), wie Sie benachrichtigt werden möchten. entweder durch eine Benachrichtigung:
Oder ein Zenity-Infofenster:
(Die Beispiele stammen aus verschiedenen Bereichen)
Wie benutzt man
Das Skript verwendet xdotool
:
sudo apt-get install xdotool
Kopieren Sie das folgende Skript in eine leere Datei und kommentieren Sie eine der folgenden Zeilen aus:
command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
(durch die notify-send
Option benachrichtigt werden )
oder:
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
für die Zenity
Option.
Speichern Sie das Skript unter ~/bin
(wahrscheinlich müssen Sie das Verzeichnis erstellen) als measure_area
(keine Erweiterung) und machen Sie es ausführbar .
Fügen Sie eine Tastenkombination Ihrer Wahl hinzu, um das Skript auszuführen: Wählen Sie: Systemeinstellungen> "Tastatur"> "Verknüpfungen"> "Benutzerdefinierte Verknüpfungen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:
measure_area
Anmerkungen
- Sie müssen sich zuerst ausloggen / einloggen
- Es macht keinen Unterschied, was Sie als erste / zweite Position einnehmen; Das Skript misst absolute Werte.
Das Drehbuch
#!/usr/bin/env python3
import subprocess
import os
import math
home = os.environ["HOME"]
area = home+"/"+".measure_area.txt"
def get_pos():
pos_data = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8")
return [m[2:] for m in pos_data.split()[:2]]
def confirm():
get = subprocess.check_output(["xrandr", "--verbose"]).decode("utf-8").split()
for s in [get[i-1] for i in range(len(get)) if get[i] == "connected"]:
br_data = float(get[get.index("Brightness:")+1])
brightness = lambda br: ["xrandr", "--output", s, "--brightness", br]
flash = ["sleep", "0.1"]
for cmd in [brightness(str(br_data-0.1)), flash, brightness(str(br_data))]:
subprocess.call(cmd)
if not os.path.exists(area):
with open(area, "wt") as measure:
measure.write(str(get_pos()))
confirm()
else:
second = get_pos()
with open(area) as first_m:
try:
first = eval(first_m.read())
w = int(math.fabs(int(second[0]) - int(first[0])))
h = int(math.fabs(int(second[1]) - int(first[1])))
#--- uncomment either one of the lines below:
# command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
#---
confirm()
except SyntaxError:
text = "Please try again, there was an error in the data"
command = ['zenity', '--info', '--title', 'Please try again', '--text', text]
subprocess.Popen(command)
os.remove(area)
Erläuterung
Wenn das Skript zum ersten Mal aufgerufen wird, erhält es die aktuelle Mausposition mit dem xdotool
Befehl:
xdotool getmouselocation
Anschließend speichert es die Position in einer (unsichtbaren) Datei .measure_area.txt
und wartet auf den zweiten Anruf.
Beim zweiten Aufruf liest es die Datei, entfernt sie, vergleicht die gespeicherten x/y
Koordinaten mit den neuesten und berechnet die Größe des Bereichs zwischen ihnen.
Bearbeiten
Das Skript wurde mit einer Reihe von Verbesserungen aktualisiert:
- Optimiert
subprocess.Popen()
/ subprocess.check_output()
Befehle (dank @muru, @Trengot)
- Reparaturvorgang für den Fall hinzugefügt, dass mit der First-Data-Datei ein Fehler aufgetreten ist (z. B. wenn der Benutzer das Skript zum ersten Mal ausgeführt hat, ohne es
xdotool
installiert zu haben)
- Beim Drücken der Tastenkombination für die ersten Koordinaten wurde ein kleiner blinkender Bestätigungsbildschirm hinzugefügt. Es scheint ein bisschen benutzerfreundlicher zu sein, dem Benutzer eine Art Bestätigung der Aktion zu geben.