使用 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"
您可能想查看这些视频,看看它们是否对您有帮助。
我希望这能为你澄清一些事情。
此致。
我正在按照 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"
您可能想查看这些视频,看看它们是否对您有帮助。
我希望这能为你澄清一些事情。
此致。