C 如何在GTK3窗口中打印纯终端命令的输出?

C 如何在GTK3窗口中打印纯终端命令的输出?,c,gtk3,C,Gtk3,我有以下GTK3代码: #include <gtk/gtk.h> void show(GtkWidget *window, gpointer ptr) {} void activate(GtkApplication *tmp, gpointer ptr) { GtkWidget *scrolled_window; GtkWidget *window; GtkWidget *button_box; GtkWidget *button; Gt

我有以下GTK3代码:

#include <gtk/gtk.h>

void show(GtkWidget *window, gpointer ptr) {}

void activate(GtkApplication *tmp, gpointer ptr) {

    GtkWidget *scrolled_window;
    GtkWidget *window;
    GtkWidget *button_box;
    GtkWidget *button;
    GtkWidget *box;
    GtkWidget *view;
    GtkTextBuffer *buffer;

    window = gtk_application_window_new(tmp);

    gtk_window_set_title(GTK_WINDOW(window), "tmp");
    gtk_window_set_default_size(GTK_WINDOW(window), 500, 500);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    scrolled_window = gtk_scrolled_window_new(NULL, NULL);

    buffer = gtk_text_buffer_new(NULL);

    view = gtk_text_view_new_with_buffer(buffer);

    gtk_widget_set_margin_start(view, 10);
    gtk_widget_set_margin_end(view, 10);
    gtk_widget_set_margin_top(view, 10);
    gtk_widget_set_margin_bottom(view, 10);

    gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE);
    gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view), FALSE);
    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);

    button = gtk_button_new_with_label("Show");

    button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);

    gtk_widget_set_halign(button_box, GTK_ALIGN_END);
    gtk_widget_set_valign(button_box, GTK_ALIGN_END);
    gtk_widget_set_margin_start(button_box, 10);
    gtk_widget_set_margin_end(button_box, 10);
    gtk_widget_set_margin_top(button_box, 0);
    gtk_widget_set_margin_bottom(button_box, 10);

    box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);

    gtk_box_pack_start(GTK_BOX(box), scrolled_window, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(box), button_box, FALSE, FALSE, 0);

    gtk_container_add(GTK_CONTAINER(scrolled_window), view);
    gtk_container_add(GTK_CONTAINER(button_box), button);
    gtk_container_add(GTK_CONTAINER(window), box);

    g_signal_connect(button, "clicked", G_CALLBACK(show), NULL);

    gtk_widget_show_all(window);
}

int main(int argc, char *argv[]) {

    GtkApplication *tmp;
    int status;

    tmp = gtk_application_new("org.gtk.tmp", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(tmp, "activate", G_CALLBACK(activate), NULL);
    status = g_application_run(G_APPLICATION(tmp), argc, argv);
    g_object_unref(tmp);

    return status;
}
#包括
无效显示(GtkWidget*窗口,gpointer ptr){}
无效激活(GTK应用程序*tmp、gpointer ptr){
GtkWidget*滚动窗口;
GtkWidget*窗口;
GtkWidget*按钮盒;
GtkWidget*按钮;
GtkWidget*框;
GtkWidget*视图;
GtkTextBuffer*缓冲区;
窗口=gtk_应用程序_窗口_新(tmp);
gtk_窗口设置标题(gtk_窗口(窗口),“tmp”);
gtk_窗口设置默认大小(gtk_窗口(窗口),500500);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
scrolled_window=gtk_scrolled_window_new(NULL,NULL);
buffer=gtk_text_buffer_new(空);
视图=gtk_文本_视图_新建_带_缓冲区(缓冲区);
gtk_小部件_设置_边距_开始(视图,10);
gtk_小部件_设置_边距_结束(视图,10);
gtk_小部件_设置_边距_顶部(视图,10);
gtk_小部件_设置_边距_底部(视图,10);
gtk_文本_视图_设置_可编辑(gtk_文本_视图(视图),FALSE);
gtk_文本_视图_设置_光标_可见(gtk_文本_视图(视图),错误);
gtk_文本_视图_设置_包装_模式(gtk_文本_视图(视图),gtk_包装_WORD);
按钮=gtk_按钮_新_,带有标签(“显示”);
按钮盒=gtk按钮盒新(gtk方向水平);
gtk_小部件设置(按钮框,gtk_对齐端);
gtk_小部件设置有效(按钮框、gtk_对齐端);
gtk_小部件_设置_边距_开始(按钮框,10);
gtk_小部件_设置_边距_结束(按钮框,10);
gtk_小部件_设置_边距_顶部(按钮框,0);
gtk_小部件_设置_边距_底部(按钮框,10);
长方体=gtk_长方体_新(gtk_方向_垂直,0);
gtk_-box_-pack_-start(gtk_-box(box)),滚动窗口,真,真,0;
gtk_盒_包装_启动(gtk_盒(盒),按钮_盒,假,假,0);
gtk_容器添加(gtk_容器(滚动窗口),视图);
gtk_容器添加(gtk_容器(按钮盒),按钮);
gtk_容器添加(gtk_容器(窗口)、盒子);
g_信号连接(按钮“点击”,g_回调(显示),空);
gtk_小部件_全部显示(窗口);
}
int main(int argc,char*argv[]){
GTK应用*tmp;
智力状态;
tmp=gtk_application_new(“org.gtk.tmp”,G_application_FLAGS_NONE);
g_信号连接(tmp,“激活”,g_回调(激活),空);
状态=g_应用程序运行(g_应用程序(tmp)、argc、argv);
g_object_unref(tmp);
返回状态;
}
我的问题是:单击“运行”后,如何在此窗口中打印纯终端命令(如“ps aux”)的输出

我从来没有写过任何关于GTK3的东西,所以,请不要告诉我,因为这是一个参考,而不是一个教程,所以要使用它,一个人需要已经知道一些GTK3


提前谢谢

我不会用解决方案复制上面的代码(我已经修改了两次,添加了我问问题后学到的内容),我只会粘贴它与最终版本代码之间的差异:

 3c3,14
< void show(GtkWidget *window, gpointer ptr) {}
---
> void show(GtkWidget *window, gpointer buffer) {
> 
>   gchar *argv[] = { "/bin/df", "--human-readable", NULL };
>   gchar *output;
>   gchar *error;
> 
>   gtk_text_buffer_set_text(buffer, "", -1);
> 
>   g_spawn_sync(NULL, argv, NULL, G_SPAWN_DEFAULT, NULL, NULL, &output, &error, NULL, NULL);
> 
>   gtk_text_buffer_insert_at_cursor(buffer, output, -1);
> }
56c67
<     g_signal_connect(button, "clicked", G_CALLBACK(show), NULL);
---
>     g_signal_connect(button, "clicked", G_CALLBACK(show), buffer);
3c3,14
无效显示(GtkWidget*窗口,gpointer缓冲区){
> 
>gchar*argv[]={”/bin/df“,“--人类可读”,NULL};
>gchar*输出;
>gchar*错误;
> 
>gtk_text_buffer_set_text(buffer,“,-1);
> 
>g_spawn_sync(NULL、argv、NULL、g_spawn_默认值、NULL、NULL、输出和错误、NULL、NULL);
> 
>gtk_text_buffer_insert_在光标处(buffer,output,-1);
> }
56c67
g_信号连接(按钮,“点击”,g_回调(显示),缓冲);
(感谢好管闲事的人提供了宝贵的建议!)


此解决方案的缺点是,您运行的命令的输出不会实时传递,而只能在命令完成时传递。因此,如果需要30秒才能完成,您的GUI将在30秒内不显示任何内容,然后一次性打印所有内容。我已经读到了答案,但我还没有查出来。

到目前为止,您是如何让这样一个仅限终端的命令(也称为“程序”)从您的代码中运行的?我完全不知道如何开始。从研究如何启动其他程序开始。GTK似乎不支持这一点。因此,您必须了解
fork()
exec()
-家族才能实现这一点。此外,您还需要了解用于连接已启动流程的
stdin
stdout
stderr
的“管道”。这并不简单,但你会找到足够的教程。因为这与GTK无关,所以将实验编写为控制台应用程序。你将从许多麻烦中解脱出来。然后,如果您对如何使用它有信心,请将它添加到您的GTK应用程序中。我很感激您的回答,但我对GTK3的用途有点困惑。我的假设是,它用于为用C或任何其他语言编写的软件创建GUI。有漂亮的窗口、按钮、下拉菜单等等,当没有简单的方法将外部代码放在后面时,有什么意义呢?好吧,现在听起来好像你有一些代码可以产生某种结果。您希望在GUI中有这样的结果。这与“在我的GUI中显示外部进程的输出”是完全不同的问题。你需要自己找一本教程。要创建一个完整且运行良好的GUI,没有简单的方法。