Bagaimana itu bekerja
Script di bawah ini mengukur ukuran area, antara dua lokasi pointer mouse.
Ini berfungsi sebagai berikut:
Tempatkan pointer mouse di posisi pertama (tanpa mengklik)
Tekan kombinasi tombol pilihan Anda (lihat lebih lanjut di bawah)
Tempatkan mouse di posisi kedua (lagi tanpa mengklik)
Tekan kombinasi tombol Anda lagi. Pemberitahuan akan memberi tahu Anda ukuran persisnya (px) dari area tersebut.
Pilihan
Anda dapat memilih (dengan menghapus komentar salah satu baris) bagaimana Anda ingin diberitahu; baik dengan pemberitahuan:
Atau jendela info Zenity:
(Contohnya dari berbagai daerah)
Bagaimana cara menggunakan
Script menggunakan xdotool
:
sudo apt-get install xdotool
Salin skrip di bawah ini ke file kosong, batalkan komentar salah satu dari baris berikut:
command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
(untuk diberitahu oleh notify-send
opsi)
atau:
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
untuk Zenity
opsi.
Simpan skrip di ~/bin
(Anda mungkin harus membuat direktori) sebagai measure_area
(tanpa ekstensi) dan membuatnya dapat dieksekusi .
Tambahkan kombinasi tombol pilihan Anda untuk menjalankan skrip: Pilih: Pengaturan Sistem> "Keyboard"> "Pintasan"> "Pintasan Khusus". Klik "+" dan tambahkan perintah:
measure_area
Catatan
- Anda harus keluar / masuk terlebih dahulu
- Itu tidak membuat perbedaan apa yang Anda ambil sebagai posisi pertama / kedua; script mengukur nilai absolut .
Naskah
#!/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)
Penjelasan
Ketika skrip dipanggil pertama kali, skrip ini mendapatkan posisi mouse saat ini dengan xdotool
perintah:
xdotool getmouselocation
Ini kemudian menyimpan posisi ke dalam file (tidak terlihat) .measure_area.txt
, menunggu panggilan kedua.
Pada panggilan kedua, ia membaca file, menghapusnya dan membandingkan x/y
koordinat yang tersimpan dengan yang terbaru, dan menghitung ukuran area di antara mereka.
Edit
Diperbarui skrip dengan sejumlah perbaikan:
- Dioptimalkan
subprocess.Popen()
/ subprocess.check_output()
perintah (terima kasih kepada @muru, @Trengot)
- Menambahkan prosedur perbaikan jika terjadi kesalahan dengan file data pertama (mis. Jika pengguna pertama kali mencoba menjalankan skrip tanpa
xdotool
menginstal)
- Menambahkan layar kecil blitz lampu kilat ketika kombinasi tombol ditekan untuk koordinat pertama. Tampaknya sedikit lebih user-friendly untuk memberikan pengguna beberapa jenis konfirmasi tindakan.