这篇文章 看起来几乎完全符合您的要求。
使用 YAD 的最佳解决方案似乎涵盖了您的要求。
例如,以下一行代码:
data="$(yad --title="Desktop entry editor" --text="Simple desktop entry editor" --form --field="Type:CB" --field="Name" --field="Generic name" --field="Comment" --field="Command:FL" --field="Icon" --field="In terminal:CHK" --field="Startup notify:CHK" "Application" "Name" "Generic name" "This is the comment" "/usr/bin/yad" "yad" FALSE TRUE --button="WebUpd8:2" --button="gtk-ok:0" --button="gtk-cancel:1")"
创建一个包含以下内容的对话框:
它看起来像这样:
![enter image description here](https://istack.dev59.com/VdNpY.webp)
输出都放在 yad 标准输出上,
echo "$data"
的输出大致如下:
Application|Name|Generic name|This is the comment|/usr/bin/yad|yad|FALSE|TRUE|
现在,您可以使用一些命令行工具(如
cut
或
awk
)来“解析”输出:
a="$(echo "$data" | cut -d"|" -f1)"
b="$(echo "$data" | cut -d"|" -f1)"
那么现在只剩下应用逻辑需要你来完成。
Ubuntu安装:
sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad
编辑:专注于将GUI转换为命令行选项
在收到一次踩后,我认为我对答案的解释是错误的。他想要的关键点是从GUI转换为命令行选项界面。
我不知道是否存在现有的解决方案,而且经过7天的悬赏仍然没有答案,我们可以假设不存在现有的解决方案。
因此,最好的办法是帮助OP自己创建一个解决方案。
我相信,由于没有那么多的命令行选项情况,一个相当小的脚本就足够了。
这里有一个Python + Tk示例
import Tkinter
import tkFileDialog
class Option(object):
def __init__(self, optype, name, widget=Tkinter.Entry):
self.optype = optype
self.name = name
if self.optype == 'switch':
self.widget = Tkinter.Checkbutton
else:
self.widget = widget
options = [
Option("key-value", "--text="),
Option("switch", "-s"),
Option("positional", "pos0"),
Option("positional", "pos1", tkFileDialog.askopenfilename),
]
def askopenfilename(filename):
filename.set(tkFileDialog.askopenfilename())
def ok_func():
cmd = "cmd_line"
for option in options:
if option.optype == "key-value":
val = tkvars[option.name].get()
if val:
cmd += ' '
cmd += '%s"%s"' % (option.name, val)
elif option.optype == "switch":
cmd += ' '
if tkvars[option.name].get() == 1:
cmd += option.name
elif option.optype == "positional":
val = tkvars[option.name].get()
if val:
cmd += ' '
cmd += val
print cmd
tkvars = {}
app = Tkinter.Tk()
grid = Tkinter.Frame()
row = 0
for option in options:
Tkinter.Label(grid, text=option.name).grid(row=row, column=0, sticky='W')
if option.widget == Tkinter.Entry:
tkvars[option.name] = Tkinter.StringVar()
widget = Tkinter.Entry(
grid,
textvariable=tkvars[option.name]
)
elif option.widget == Tkinter.Checkbutton:
tkvars[option.name] = Tkinter.IntVar()
widget = Tkinter.Checkbutton(
grid,
variable = tkvars[option.name],
onvalue = 1
)
elif option.widget == tkFileDialog.askopenfilename:
tkvars[option.name] = Tkinter.StringVar()
widget = Tkinter.Button(
grid,
text='Browse',
command=lambda: askopenfilename(tkvars[option.name])
)
widget.grid(row=row, column=1, sticky='W')
row += 1
grid.pack()
Tkinter.Button(app, text="ok", command=ok_func).pack()
Tkinter.Button(app, text="quit", command=app.quit).pack()
app.mainloop()
在Ubuntu 12.04上运行,首先执行:
sudo apt-get install python-tk
屏幕截图:
![enter image description here](https://istack.dev59.com/vxr1f.webp)
生成截图的命令:
cmd_line --text="asdf" -s qwer /path/to/file
行为:
- 如果
--text=
的值为空,则省略
- 开关只会出现在相应的复选框被选中时
如果你想在该代码的基础上实现一个新功能,我建议你在这里进行操作。
如果足够好,我们可以将其拆分为一个新的存储库,并使其可通过pip安装。
gtkdialog
应该能够帮助您使用bash脚本和glade(xml)完成此操作。请访问http://pclosmag.com/html/Issues/200910/page21.html。 - Petr Skocik