图形 GTK 程序是否也有可能像GNU readline、editline或linenoise提供的那样具有“命令行界面” ?
如何处理阻塞 gtk_main() 调用,并阻止这些库中的循环步骤?
将诸如 GNU readline 之类的库与图形程序集成是绝对可能的。最简单的选择是生成一个专用于 readline 的线程,并使用g_idle_add
(这是线程安全的)与 GUI 线程通信。
如果您不想使用线程,您可以使用 GIO 机制 (g_io_channel_unix_new()
和g_io_add_watch()
) 指示 GTK 主循环通知您待处理的输入,并使用为用作事件循环回调而设计的备用接口调用 readline。Python 的 readline 支持和 PyGTK 利用这些功能在一个线程中启用以下功能:
>>> import gtk
>>> w = gtk.Window()
>>> w.add(gtk.Label("foo"))
>>> w.show_all() # at this point, a window with label is shown
然而,一个不同的问题是,您是否希望您的程序在 21 世纪运行基于终端仿真的命令行界面。在 GTK 中,您有一个远远超过 readline() 的多行编辑工具,它被称为GtkTextView
. 使用它来构建一个类似命令行的工具非常简单(而且,我可能会补充一点,很有趣),它在复制粘贴、多行编辑、Unicode、颜色、比例字体、嵌入图像或工作方面没有问题在 Windows 上——并且不依赖于神秘的终端代码来启动。