我需要在 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
经过几个小时的谷歌搜索,我惊讶地发现找不到此代码的示例。希望其他谷歌搜索相同问题的人可以找到此代码。
屏幕
在此答案中,zenity
表单的顺序不同,字段的标签也进行了扩展。尽管4882对于这个intel_backlight
司机来说,这是最大的,就像盯着太阳一样1000在室内是最实用的。
非常感谢穆鲁用于将原始代码从使用字段名称的旧式 COBOL 格式转换为利用数组的现代 Bash 格式。
使用yad
而不是zenity
2018 年,我修改了这个项目,并将其重命名为令人赏心悦目。现在它使用的yad
是 的增强型分叉版本zenity
。yad
使用 bash 中的相同编码风格并添加了更多功能。
笔记本支持多个标签
使用yad
您可以显示当前字段值并以选项卡式笔记本格式创建表单:
在写这个答案时,我发现屏幕上的内容已经过时了,显示为5 to 20 seconds
。我已将其更改1 to 20 seconds
为在下一次发布时显示。
从选项卡列表中监视 3
以下是选项卡列表中监视器 3 的样子:
下一节列出了生成此屏幕的示例代码。
示例代码
这三个监视器共享一个共同的功能来构建大部分代码。对于监视器 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回答:
访问eyesome
github 页面并在此处下载所有 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