使用yad而不是zenity

使用yad而不是zenity

我需要在 Bash 中设置一个配置文件,并相信 Zenity 是最好的方法,但在使用谷歌查找带有合适示例的链接时遇到了问题。

到目前为止我的代码如下所示:

#!/bin/bash

zenity --forms --title="Laptop Adaptive Brightness" --text="Set Configuration" \
   --add-entry="/sys/class/backlight/??????/brightness" \
   --add-entry="Night time (min) value" \
   --add-entry="Day time (max) value" \
   --add-entry="Minutes after sunrise to max" \
   --add-entry="Minutes before sunset to min"

exit

结果屏幕如下所示:

自适应亮度配置

如果无法为 Zenity 变量预先赋值,那么我可以将当​​前值放入字段标签中,即:

   --add-entry="Night time (min) value (Current: $min)", \

并且用户可以将字段留空以保持不变或输入新值。

我仍然不知道如何将 Zenity 字段提取到 bash 变量中并将它们写入配置文件。此外,我还不知道如何从配置文件读取到 bash 变量中的代码。

如果有 Zenity 示例的链接或完整答案就更好了。谢谢。

PS 当我运行上述脚本时,完成后会报告错误:

$ adaptive-brightness-configGtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
||||

我对此有点困惑,如果你能指出我做错的地方,我将不胜感激。

答案1

Zenity 只能在只有一个输入字段时显示以前的值。因此,下面的代码将以前的值放入标签字段,并指示用户在输入字段中输入新值或将其留空以保留现有值。

Bash 代码

#!/bin/bash

# Read configuration file with entries separated by " " into array
IFS=' ' read -ra CfgArr < ~/bin/adaptive-brightness-configuration-file

# Zenity form with current values in entry label
# because initializing multiple entry data fields not supported
output=$(zenity --forms --title="Laptop Adaptive Brightness Configuration" \
        --text="Enter new settings or leave entries blank to keep (existing) settings" \
   --add-entry="/sys/class/backlight/??????/brightness driver : (${CfgArr[0]})" \
   --add-entry="Day time maximum display brightness : (${CfgArr[1]})" \
   --add-entry="Transition minutes after sunrise to maximum : (${CfgArr[2]})" \
   --add-entry="Night time minimum display brightness : (${CfgArr[3]})" \
   --add-entry="Transition minutes before sunset to minimum : (${CfgArr[4]})")

IFS='|' read -a ZenArr <<<$output # Split zenity entries separated by "|" into array elements

# Update non-blank zenity array entries into configuration array
for i in ${!ZenArr[@]}; do
    if [[ ${ZenArr[i]} != "" ]]; then CfgArr[i]=${ZenArr[i]} ; fi
done

# write configuration file using array (fields automatically separated by " ")
echo "${CfgArr[@]}" > ~/bin/adaptive-brightness-configuration-file

经过几个小时的谷歌搜索,我惊讶地发现找不到此代码的示例。希望其他谷歌搜索相同问题的人可以找到此代码。

屏幕

自适应亮度 3

在此答案中,zenity表单的顺序不同,字段的标签也进行了扩展。尽管4882对于这个intel_backlight司机来说,这是最大的,就像盯着太阳一样1000在室内是最实用的。

非常感谢穆鲁用于将原始代码从使用字段名称的旧式 COBOL 格式转换为利用数组的现代 Bash 格式。


使用yad而不是zenity

2018 年,我修改了这个项目,并将其重命名为令人赏心悦目。现在它使用的yad是 的增强型分叉版本zenityyad使用 bash 中的相同编码风格并添加了更多功能。

笔记本支持多个标签

使用yad您可以显示当前字段值并以选项卡式笔记本格式创建表单:

eyeshem-编辑配置-常规.png

在写这个答案时,我发现屏幕上的内容已经过时了,显示为5 to 20 seconds。我已将其更改1 to 20 seconds为在下一次发布时显示。

从选项卡列表中监视 3

以下是选项卡列表中监视器 3 的样子:

eyeshem-编辑-配置监视器-3.png

下一节列出了生成此屏幕的示例代码。

示例代码

这三个监视器共享一个共同的功能来构建大部分代码。对于监视器 3,我们使用:

# Monitor 3 notebook page
BuildMonitorPage "$CFG_MON3_NDX"
yad --plug=$KEY --tabnum=4 --form \
    "${aMonPage[@]}" > "$res4" &

不过,函数BuildMonitorPage会完成繁重的工作。它如下所示:

BuildMonitorPage () {
    # Move configuration array monitor 1-3 to Working Screen fields
    # $1 = CfgArr Starting Index Number

    aMonPage=()
    i="$1"
    aMonPage+=("--field=Monitor Number::RO")
    aMonPage+=("${CfgArr[$((i++))]}")

    aMonPage+=("--field=Monitor Status::CB")
    Status=("${CfgArr[$((i++))]}")
    cbStatus="Enabled!Disabled"
    cbStatus="${cbStatus/$Status/\^$Status}"
    aMonPage+=("$cbStatus")

    aMonPage+=("--field=Monitor Type::CB")
    Type=("${CfgArr[$((i++))]}")
    cbType="Hardware!Software"
    cbType="${cbType/$Type/\^$Type}"
    aMonPage+=("$cbType")

    aMonPage+=("--field=Monitor Name:")
    aMonPage+=("${CfgArr[$((i++))]}")
    aMonPage+=("--field=Internal Name:")
    aMonPage+=("${CfgArr[$((i++))]}")
    aMonPage+=("--field=Xrandr Name:")
    aMonPage+=("${CfgArr[$((i++))]}")
    aMonPage+=("--field=Daytime Brightness::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..9999!.01!2)
    aMonPage+=("--field=Daytime Red::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Daytime Green::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Daytime Blue::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Nighttime Brightness::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..9999!.01!2)
    aMonPage+=("--field=Nighttime Red::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Nighttime Green::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Nighttime Blue::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Current Brightness::RO")
    aMonPage+=("${CfgArr[$((i++))]}")
    aMonPage+=("--field=Current Gamma::RO")
    aMonPage+=("${CfgArr[$((i++))]}")
    
} # BuildMonitorPage

Yad 默认将数字内部存储为小数点后 6 位。在向用户展示时,您可以覆盖使用的小数位数。在上面的代码中,您可以看到:

    aMonPage+=("--field=Nighttime Brightness::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..9999!.01!2)

最后一行包含配置数组的当前值(CfgArr),后面跟着:

  • 0.1最小允许值
  • 9999最大允许值
  • .01如果用户按向上箭头或向下箭头来更改,则步长值
  • 2屏幕上显示的小数位数

要查看所有屏幕并阅读概述,请参阅此询问 Ubuntu回答:

访问eyesomegithub 页面并在此处下载所有 bash 代码:

答案2

yad做同样的事情要容易得多

$ yad --form                                                  \
   --field "/sys/class/backlight/??????/brightness driver" 10 \
   --field "Day time maximum display brightness" 20           \
   --field "Transition minutes after sunrise to maximum" 30   # And so go on

在此处输入图片描述

相关内容