单个 BASH shell 脚本中的 GTK 命令,这可能吗?

Gol*_*ngs 6 python command-line bash scripts

在具有循环变量等的bash shell 脚本(单个文件)中是否有可能在其他程序中执行zenity删除 zenity 并添加 GTK 函数?

如果是,那么是否还可以将 bash 命令、变量、循环(从 bash shell 脚本复制)添加到qt4 设计器

我要问的是,GTK 函数是否有可能bash shell 脚本中的 bash 命令或什至与 qt4 设计器的 bash 命令结合使用。

我想摆脱 zenity(或 yad、kdialog),因为它非常限于更高级的 Windows,并且仍然使用 bash shell 脚本中已有的所有其余 bash 函数,这可能吗?

mur*_*uru 11

Python 中没有 GTK+ 函数那样的“GTK 命令”。GTK+ 是一个具有多种语言绑定的库,但它提供的功能没有可执行命令。您可以尝试通过一些外部命令执行 GTK+ API 可以执行的部分操作:

  • zenity、yad 等用于显示对话框
  • xsel 或 xclip 访问剪贴板
  • wmctrl 用于控制应用程序窗口

但是绝大多数 GTK+ 功能无法通过命令访问。


Ser*_*nyy 7

根据 POSIX 定义,Shell 只是命令解释器。Gtk 是一个库,旨在以实际的编程语言导入。所以答案是否定的,你不能在 shell 脚本中使用成熟的 Gtk 东西,只能使用yadzenity允许的有限的东西。

但是你可以使用Python。它是一种脚本语言,但比 shell 更适合系统和编程。您可以调用存储在类似/bin/usr/bin通过 Python 中的 subprocess 模块的地方的命令。我已经为我的 Gtk 应用程序做过很多次了。

例如,这是我用于从 Python 脚本调用外部命令的标准函数:

def run_cmd(self, cmdlist):
    """ Reusable function for running external commands """
    new_env = dict(os.environ)
    new_env['LC_ALL'] = 'C'
    try:
        stdout = subprocess.check_output(cmdlist, env=new_env)
    except subprocess.CalledProcessError:
        pass
    else:
        if stdout:
            return stdout
Run Code Online (Sandbox Code Playgroud)

这是一个在我的示例中使用它xrandr-indicator从 Ubuntu 的顶部面板切换屏幕分辨率的示例;顾名思义,它xrandr在幕后调用:

    self.run_cmd(['xrandr','--output',out,'--mode',mode]) 
Run Code Online (Sandbox Code Playgroud)

至于 shell,您需要使用 -c 参数调用 shell。所以这样的事情可以工作:

subprocess.Popen(['bash','-c', 'echo hello world'])
Run Code Online (Sandbox Code Playgroud)

或者,考虑实现进程间通信。在 python 中制作 GUI,但让它通过命名管道或文件与 shell 脚本通信。

  • 也许值得注意的是,为了让 GTK 起作用,必须先调用 `gtk_init()`,然后分配一些像 `GtkWidget`s 这样的资源。当创建它的应用程序退出时,所有这些上下文都会丢失。这排除了 GTK“命令”的任何可能性,除非人们愿意让“GTK 守护进程”或其他一些实体执行传递给它的命令并存储上下文。 (2认同)