1

我的 zenity 有问题,我无法锻炼。你们能帮帮我吗?

我有一个 7 行长的 tmp3 文件:

AAA
BBB
...
FFF
GGG

我想通过 zenity 发送这个文件,以便它显示一个清单,可以用我想要的每个组合检查我想要的每一行。

我之前写过:

cat tmp3 | zenity --list \
                  --column='#' \
                  --text "Select playlist from the list below" \
                  --title "Please select one or more playlists" \
                  --multiple \
                  --width=300 \
                  --height=300 \
                  --checklist \
                  --column "Select" \
                  --separator="/ ")

所有这一切都是在 zenity 中创建一个包含所有 7 个 tmp3 文件的单行。那不是我想要的。

我目前是这样写的:

choice=$(zenity --list \
                --column "Playlists" FALSE $(cat tmp3) \
                --text "Select playlist from the list below" \
                --title "Please select one or more playlists" \
                --multiple \
                --width=300 \
                --height=300 \
                --checklist \
                --column "Select" \
                --separator="/ ")

这里发生了一些我不明白的非常奇怪的事情。zenity 中创建了 7 个字段中的 4 个:AAA CCC EEE 和 GGG。但不是其他的。当我设置 -x 进行调试时,我可以看到所有 7 行都通过管道传输到 zenity ......发生了什么事??????

我尝试了另一种解决方案,列出了我当前文件夹中的 7 个子文件夹(恰好与 tmp3 中的行具有完全相同的名称)。发生同样的事情!:

我写了这个:

choice=$(zenity --list \
                --column "Playlists" FALSE $(ls -d -1 */) \
                --text "Select playlist from the list below" \
                --title "Please select one or more playlists" \
                --multiple \
                --width=300 \
                --height=300 \
                --checklist \
                --column "Select" \
                --separator="/ ")

第二种解决方案似乎更容易,但我的技能不是很高。我想了解后一种解决方案以及它为什么这样做。

感谢你们!

编辑:我找到了这个并试图让它按照我的方式工作,但到目前为止没有成功...... http://www.linuxquestions.org/questions/programming-9/reading-lines-to-an-array-and-生成-动态-zenity-list-881421/

4

5 回答 5

2

该部分FALSE $(cat tmp3)扩展为

FALSE AAA
BBB
CCC
DDD
EEE
FFF
GGG

你需要的是

FALSE AAA
FALSE BBB
FALSE CCC
FALSE DDD
FALSE EEE
FALSE FFF
FALSE GGG

实现这一目标的一种方法是--column "Playlists" $(sed s/^/FALSE\ / tmp3) \

于 2013-11-12T14:05:29.770 回答
1

我知道我有点晚了,但想要的只是同样的事情,最后想通了。我的解决方案进行搜索(隐藏错误),为每个结果添加 TRUE 和换行符(这是关键!),然后将结果发送到 zenity:

CHECKED=`find /music/folder -name "*.mp3" -type f 2>/dev/null | \
         awk '{print "TRUE\n"$0}' | \
         zenity --list --checklist --separator='\n' --title="Select Results." \
                --text="Finding all MP3 files..." --column="" --column="Files"`

在你的情况下,我想这应该是:

CHECKED=`cat tmp3 | awk '{print "TRUE\n"$0}' | zenity --list --checklist \
         --separator='/ ' --title="Select Results." \
         --text="Finding all MP3 files..." --column="" --column="Select"`

因此,Zenity 似乎将每个换行符放在一列中,并以这种方式填充列表。这意味着您可以操纵进入 Zenity 的字符串以添加任意数量的列。

于 2013-11-29T21:06:37.787 回答
0

简而言之,您有两种选择:

选项一: 输入文件,换行分隔列

代替

cat tmp3 | zenity ... ...

做:

sed 's/^/.\n/' tmp3 | zenity ... ...

选项二:内联命令,列从命令 args 中成对读取

代替

cat tmp3 | zenity ... ...

做:

zenity ... ... `sed 's/^/. /' tmp3`
于 2014-12-13T11:07:05.373 回答
0

有一个有趣的例子man zenity

zenity \
    --list \
    --checklist \
    --column "Buy" \
    --column "Item" \
    TRUE Apples \
    TRUE Oranges \
    FALSE Pears \
    FALSE Toothpaste

你只需要打开一个神经元来适应它=)

你能行的

编辑

如果你有一个未定义的长度列表,这个例子会更有趣:

find . -name '*.h' |
zenity \
    --list \
    --title "Search Results" \
    --text "Finding all header files.." \
    --column "Files"
于 2013-02-19T22:38:52.053 回答
-1
$ zenity --list --checklist --height 400 --text "Select playlist from the list below" --title "Please select one or more playlists" --column "Playlists" --column "Select" --separator="/ "  
$(ls -d -1 */ | xargs -L1 echo FALSE)
于 2017-11-24T13:45:36.620 回答