使用 C 在 GTK2 中创建并保存文件

Create and save a file in GTK2 using C

我正在按照 Raspberry Pi 官方书籍 C 和 GUI 编程简介link)的说明进行操作。

它使用 GTK2 在 C 中创建一个 gui。

我在尝试保存文件的代码时遇到了一些问题。这是本书的代码(我用过的):

#include <gtk/gtk.h>

static void save_file (GtkWidget *btn, gpointer ptr)
{
    GtkWidget *sch = gtk_file_chooser_dialog_new ("Save file", GTK_WINDOW (ptr), GTK_FILE_CHOOSER_ACTION_SAVE, "Cancel", 0, "OK", 1, NULL);

    if (gtk_dialog_run (GTK_DIALOG (sch)) == 1)
    {
        printf ("%s selected\n", gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (sch)));
    }
    gtk_widget_destroy (sch);
}

void end_program (GtkWidget *wid, gpointer ptr)
{
    gtk_main_quit ();
}

int main (int argc, char * argv[])
{
    gtk_init (&argc, &argv);
    GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    GtkWidget *btn = gtk_button_new_with_label ("Close window");

    g_signal_connect (btn, "clicked", G_CALLBACK (end_program), NULL);
    g_signal_connect (win, "delete_event", G_CALLBACK (end_program), NULL);

    GtkWidget *vbox = gtk_vbox_new (FALSE, 5);
    gtk_container_add (GTK_CONTAINER (win), box);

    GtkWidget *fc_btn = gtk_button_new_with_label ("Save file");
    g_signal_connect (fc_btn, "clicked", G_CALLBACK (save_file), win);

    gtk_box_pack_start (GTK_BOX (vbox), fc_btn, TRUE, TRUE, 0);
    gtk_box_pack_start (GTK_BOX (vbox), btn, TRUE, TRUE, 0);
    gtk_widget_show_all (win);

    gtk_main ();

    return 0;
}

书上说这个程序应该打开一个带有按钮的 window,如果单击该按钮,将打开一个新的 window,我可以在其中插入文件名,然后单击确定我应该可以保存了。

生成的文件路径在终端内正确打印。

如果我在我保存文件的路径里面输入,文件不存在!它既没有隐藏也没有用不同的名称保存。

这段代码中是否缺少某些内容?

我在上面给你留下了评论。如前所述,我在您的 link 中查看了本书 PDF 版本中的示例代码。该代码的目的是显示一个文件选择器对话框小部件,并通过在控制台中打印完整路径来确认您 select 或键入的文件的名称。按原样,该程序没有将文件实际写入存储介质的机制。这就是为什么当您查看系统上的文件夹时看不到文件的原因。如果您至少想要一个实际编写的文件,则需要添加更多代码。只是为了给您一个非常简单的示例,说明它可能是什么样子,我对示例程序中的“save_file”函数进行了修改,如以下代码片段所示。

static void save_file (GtkWidget *btn, gpointer ptr)
{
    GtkWidget *sch = gtk_file_chooser_dialog_new ("Save file", GTK_WINDOW (ptr), GTK_FILE_CHOOSER_ACTION_SAVE, "Cancel", 0, "OK", 1, NULL);
    
    if (gtk_dialog_run (GTK_DIALOG (sch)) == 1)
    {
        printf ("%s selected\n", gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (sch)));
        char cmd[1024];
        strcpy(cmd, "touch ");
        strcat(cmd, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (sch)));
        system(cmd);
    }
    gtk_widget_destroy (sch);
}

仅供参考,我在 Linux 系统上构建了这个修改后的程序,使用“touch”命令更新现有文件的时间戳或创建一个新的空文件,“system”命令允许像使用终端一样执行程序。你提到了一个 Raspberry Pi 系统,我相信它使用 Linux 或类似 Linux 的操作系统,所以这些命令应该可以工作。

如需更多示例和教程,您可能需要查看网络上的一些视频。以下 link 不是具体的推荐,但它是我在网上找到的第一个视频,其中介绍了使用 GTK 进行 C 编码的各个步骤,包括对 GTK 文件选择器对话框的引用。

"https://www.youtube.com/watch?v=EdJVkr87LSk&list=PLMkSWKN9VsZH562FmV8sMvMu_sVZsYAt6"

您可能想查看这些视频,看看它们是否对您有帮助。

我希望这能为你澄清一些事情。

此致。