Jak to działa
Poniższy skrypt mierzy rozmiar obszaru między dwiema lokalizacjami wskaźnika myszy.
Działa w następujący sposób:
Umieść wskaźnik myszy w pierwszej pozycji (bez klikania)
Naciśnij wybraną kombinację klawiszy (patrz dalej poniżej)
Umieść mysz w drugiej pozycji (ponownie bez klikania)
Naciśnij ponownie kombinację klawiszy. Powiadomienie powie ci dokładny rozmiar (px) obszaru.
Opcje
Możesz wybrać (odznaczając jedną z linii), w jaki sposób chcesz otrzymywać powiadomienia; albo poprzez powiadomienie:
Lub okno informacyjne Zenity:
(Przykłady pochodzą z różnych dziedzin)
Jak używać
Skrypt wykorzystuje xdotool
:
sudo apt-get install xdotool
Skopiuj poniższy skrypt do pustego pliku, odkomentuj jeden z wierszy:
command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
(powiadamia notify-send
opcja)
lub:
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
dla Zenity
opcji.
Zapisz skrypt w ~/bin
(prawdopodobnie będziesz musiał utworzyć katalog) jako measure_area
(bez rozszerzenia) i uczyń go wykonywalnym .
Dodaj dowolną kombinację klawiszy, aby uruchomić skrypt: Wybierz: Ustawienia systemu> „Klawiatura”> „Skróty”> „Skróty niestandardowe”. Kliknij „+” i dodaj polecenie:
measure_area
Uwagi
- Najpierw musisz się wylogować / zalogować
- Nie ma znaczenia, co bierzesz za pierwszą / drugą pozycję; skrypt mierzy wartości bezwzględne .
Scenariusz
#!/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)
Wyjaśnienie
Gdy skrypt jest wywoływany po raz pierwszy, pobiera bieżącą pozycję myszy za pomocą xdotool
polecenia:
xdotool getmouselocation
Następnie zapisuje pozycję w (niewidocznym) pliku .measure_area.txt
, czekając na drugie połączenie.
Przy drugim wywołaniu odczytuje plik, usuwa go i porównuje zapisane x/y
współrzędne z najnowszymi oraz oblicza wielkość obszaru między nimi.
Edytować
Zaktualizowano skrypt o kilka ulepszeń:
- Zoptymalizowany
subprocess.Popen()
/subprocess.check_output()
polecenia (dzięki @muru, @Trengot)
- Dodano procedurę naprawy na wypadek, gdyby coś poszło nie tak z plikiem pierwszych danych (np. Jeśli użytkownik najpierw próbował uruchomić skrypt bez niego
xdotool
instalacji)
- Dodano mały ekran z przyciemnieniem migającego ekranu po naciśnięciu kombinacji klawiszy dla pierwszych współrzędnych. Wydaje się, że jest nieco bardziej przyjazny dla użytkownika, aby dać mu jakieś potwierdzenie działania.