不活动时关闭外部显示器

不活动时关闭外部显示器

上周我给我的笔记本电脑添加了一个外接显示器,除了亮度和锁定行为之外,几乎所有东西都可以按我想要的方式运行。

我早就把这个设置为“不活动时关闭屏幕:5 分钟”,它对笔记本电脑屏幕非常有效 - 无论是在添加外接显示器之前还是之后。但它在外接显示器上不起作用。当我离开办公桌的时间超过预期时,我回到笔记本电脑屏幕时会看到黑色屏幕,外接显示器上显示锁定屏幕和登录输入。

这个问题似乎类似于这个问题,但那张图中的主显示器似乎没有变黑。这就是我将其作为单独问题发布的原因。

是的,我知道我可以关闭显示器的电源,而且我晚上也会这样做,但如果可能的话,我希望它与本机屏幕同步变黑。

我使用的是 14.04。显示器通过 HDMI 连接。笔记本电脑是 VAIO,现在已经有点旧了。

后续编辑

作为后续工作,当我在接受的答案中测试 bash 脚本时,我设置了一个较低的超时时间,从终端运行该脚本,看到两个显示器都变暗为黑色,然后接受了答案。随后,我实际上将脚本(重新设置超时时间)添加到我的启动脚本中并重新启动了我的计算机。

在我第一次比预期的离开时间更长之后,想象一下,当我回到我的办公桌前发现我的外接显示器闪闪发光时我会有多么惊讶!

随后的研究表明,这很可能是由 HDMI 显示器本身引起的,并且没有脚本可以修复它。事实上,当这个脚本启动时,我(偶然)坐在我的办公桌前。两个显示器都变黑了,大约一分钟后,外接显示器又自动打开了。:-(

好吧,我试过了。

答案1

我怀疑这个问题是 bug 造成的,因为我找不到其他原因。至少可以使用下面的后台脚本作为解决方法。

该脚本在我的系统上可以正常工作,但您必须尝试一下。如果它在您的系统上不起作用,我们可以切换到xrandr专门切换每台监视器,但这是最简单的选择。

资源?

关于资源,你不必担心,脚本每十秒检查一次是否超出了空闲时间。即使我做了 10 次每秒,负载实际上为零。

#!/usr/bin/env python3
import subprocess
import time

t = 300

scr = True
while True:
    time.sleep(10)
    idle = int(subprocess.check_output("xprintidle").decode("utf-8").strip())/1000
    if idle > t and scr == True:
        subprocess.Popen(["xset", "dpms", "force", "off"])
        scr = False
    elif idle < t and scr == False:
        subprocess.Popen(["xset", "dpms", "force", "on"])
        scr = True

如何使用

  1. 该脚本需要xprintidle

    sudo apt-get install xprintidle
    
  2. 将脚本复制到一个空文件中,另存为switchoff.py

  3. 在脚本的头部,设置空闲时间(以秒为单位):

    t = 300
    
  4. 关掉你的“正常”空闲时间过后关闭屏幕-设置

  5. 使用以下命令运行脚本:

    python3 /path/to/switchoff.py
    
  6. 如果一切正常,将其添加到启动应用程序:Dash > 启动应用程序 > 添加。

    添加命令:

    /bin/bash -c "sleep 15 &&  python3 /path/to/switchoff.py"
    

编辑

根据评论中的要求,以下是同一脚本的 bash 版本。不过您仍然需要安装xprintidle

#!/bin/bash

# --- set the idle time in seconds below
let "t = 300"
# ---

let "div = 1000"
t=$(($t * $div))
scr=true

while true
do
  sleep 10
  let "idle = "$(xprintidle)""
  if  [ "$idle" -gt "$t" ] && [ "$scr" = true ] 
  then
    scr=false
    xset dpms force off
  elif [ "$idle" -lt "$t" ] && [ "$scr" = false ] 
  then
    xset dpms force on
    scr=true
  fi
done

笔记

  • 由于我们不知道是什么原因导致了你的系统出现这种行为,我们仍然需要确定是否有必要专门关闭你的屏幕每屏幕xrandr。你一定要尝试一下。

相关内容