Python
用於突出顯示目前螢幕的腳本 highlight_focus 不起作用
我想從下面的討論中安裝這個腳本,它可以讓我突出顯示目前螢幕。
我使用 linux mint 和 Cinnamon 桌面,我按照說明安裝
wmctrl
,將腳本另存為highlight_focus
,註銷並使用 python3 執行腳本。我收到的輸出如下:
no second screen seems to be connected Traceback (most recent call last): File "/home/fabrizio/Documents/Linux Scripts/highlight_focus.py", line 50, in <module> left_scr = screendata[1][0][0]; right_scr = screendata[1][1] TypeError: 'NoneType' object is not subscriptable
我有三個螢幕、兩個顯示器(一個是 HDMI,另一個是 DVI)和原來的筆記型電腦螢幕,該螢幕已停用。
此外,這是腳本中觸發錯誤的程式碼:
def get_onscreen(): # get the size of the desktop, the names of both screens and the x-resolution of the left screen resdata = subprocess.check_output(["xrandr"]).decode("utf-8") if resdata.count(" connected") == 2: resdata = resdata.splitlines() r = resdata[0].split(); span = int(r[r.index("current")+1]) screens = [l for l in resdata if " connected" in l] lr = [[(l.split()[0], int([s.split("x")[0] for s in l.split() if "+0+0" in s][0])) for l in screens if "+0+0" in l][0], [l.split()[0] for l in screens if not "+0+0" in l][0]] return [span, lr] else: print("no second screen seems to be connected")
該腳本由Jacob Vlijm在 Ask Ubuntu 上創建。
我的系統:
Distributor ID: LinuxMint Description: Linux Mint 18 Sarah Release: 18 Codename: sarah Linux fabrizio-Lenovo-G50-70 4.6.0-040600-generic #201606100558 SMP Fri Jun 10 10:01:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
這是的輸出
xrand
:Screen 0: minimum 8 x 8, current 3840 x 1080, maximum 32767 x 32767 eDP1 connected (normal left inverted right x axis y axis) 1366x768 60.00 + 1360x768 59.80 59.96 1280x720 60.00 1024x768 60.00 1024x576 60.00 960x540 60.00 800x600 60.32 56.25 864x486 60.00 640x480 59.94 720x405 60.00 680x384 60.00 640x360 60.00 DP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 521mm x 293mm 1920x1080 60.00*+ 1680x1050 59.95 1600x900 60.00 1280x1024 75.02 60.02 1440x900 59.89 1280x800 59.81 1152x864 75.00 1280x720 60.00 1024x768 75.03 70.07 60.00 832x624 74.55 800x600 72.19 75.00 60.32 56.25 640x480 75.00 72.81 66.67 59.94 720x400 70.08 HDMI1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 521mm x 293mm 1920x1080 60.00*+ 50.00 59.94 1680x1050 59.88 1600x900 60.00 1280x1024 75.02 60.02 1440x900 59.90 1280x800 59.91 1152x864 75.00 1280x720 60.00 50.00 59.94 1024x768 75.03 70.07 60.00 832x624 74.55 800x600 72.19 75.00 60.32 56.25 720x576 50.00 720x480 60.00 59.94 640x480 75.00 72.81 66.67 60.00 59.94 720x400 70.08 HDMI2 disconnected (normal left inverted right x axis y axis) VIRTUAL1 disconnected (normal left inverted right x axis y axis)
我已經更改了原始腳本。它現在檢查是否有超過 1 個監視器(不完全是 2 個)。我還更改了主動監視器檢測邏輯。它仍然不適用於 2 台以上的顯示器,但應該適合您。
#!/usr/bin/env python3 """ In a side-by-side dual monitor setup (left-right), the script below will give a short dim- flash on the newly focussed screen if the focussed screen changes """ import subprocess import time def get_wposition(): # get the position of the currently frontmost window try: w_data = subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines() frontmost = subprocess.check_output(["xprop", "-root", "_NET_ACTIVE_WINDOW"]).decode("utf-8").split()[-1].strip() z = 10-len(frontmost); frontmost = frontmost[:2]+z*"0"+frontmost[2:] return [int(l.split()[2]) for l in w_data if frontmost in l][0] except subprocess.CalledProcessError: pass def get_onscreen(): # get the size of the desktop, the names of both screens and the x-resolution of the left screen resdata = subprocess.check_output(["xrandr"]).decode("utf-8") if resdata.count(" connected") >= 2: resdata = resdata.splitlines() r = resdata[0].split(); span = int(r[r.index("current")+1]) screens = [l for l in resdata if " connected" in l] lr = [[(l.split()[0], int([s.split("x")[0] for s in l.split() if "+0+0" in s][0])) for l in screens if "+0+0" in l][0], [l.split()[0] for l in screens if not "+0+0" in l and "+0" in l][0]] return [span, lr] else: print("no second screen seems to be connected") def scr_position(span, limit, pos): # determine if the frontmost window is on the left- or right screen if limit < pos < span: return [right_scr, left_scr] else: return [left_scr, right_scr] def highlight(scr1): # highlight the "active" window, dim the other one subprocess.Popen([ "xrandr", "--output", scr1, "--brightness", "0.3"]) time.sleep(0.1) subprocess.Popen([ "xrandr", "--output", scr1, "--brightness", "1.0"]) # determine the screen setup screendata = get_onscreen() left_scr = screendata[1][0][0]; right_scr = screendata[1][1] print(left_scr, right_scr) limit = screendata[1][0][1]; span = screendata[0] # set initial highlight oncurrent1 = [] while True: time.sleep(0.5) pos = get_wposition() # bypass possible incidental failures of the wmctrl command if pos != None: oncurrent2 = scr_position(span, limit, pos) # only set highlight if there is a change in active window if oncurrent2 != oncurrent1: highlight(oncurrent2[0]) oncurrent1 = oncurrent2