У меня есть проект C (в Linux), который вообще не использует GTK, но я хотел бы использовать GTK только для некоторых конкретных задач, таких как выбор файла (выбор файла диалог). Поэтому у меня нет родительского окна GTK, нет основного цикла gtk и т. Д. Мне нужен диалог выбора файлов, который должен блокировать выполнение моей программы до того, как пользователь выберет файл (или отменен), и я не буду использовать GTK после этого Когда-либо. То, что я пробовал:Выбор файла GTK + 3 в приложении без GTK
https://developer.gnome.org/gtk3/stable/GtkFileChooserDialog.html
Я использовал код на «Типичное использование», в первом примере. Я положил gtk_init (& argc,argv) в начале моей программы, и когда мне нужен выбор файла, я вызываю функцию с кодом из этого примера (я использую parent как NULL, так как нет родителя). Результатом является мигающее окно на долю секунды, затем SIGSEGV. До этого у меня есть это сообщение:
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Я уже читать вопросы/ответы на это сообщение здесь StackOverflow, но сбой приложения является более серьезной для меня. Я также попытался поставить это:
gtk_widget_show_all(dialog);
после gtk_file_chooser_dialog_new(), который не приводит к аварии, я могу выбрать файл, но у меня есть SIGSEGV снова вокруг gtk_file_chooser_get_filename().
При использовании GDB, я получил это:
Program received signal SIGSEGV, Segmentation fault.
__GI___pthread_mutex_lock (mutex=0x3c3) at ../nptl/pthread_mutex_lock.c:67
Можете ли вы помочь мне, что ошибка, которую я сделал? Я слишком плохо знаком с программированием GTK, поэтому я попытался использовать примеры из руководства, но он, похоже, не работает. Заранее большое спасибо!
Или, как альтернатива использованию GTK вообще, вы можете захотеть запустить ['zenity'] (https://help.gnome.org/users/zenity/stable/file-selection.html.en) как подпроцесс. – duskwuff
Я тоже так думал (с основной петлей gtk), но gtk_dialog_run() чувствовал, что это трюк. Также обратите внимание на то, что только в примере, о котором я упоминал, окно отображается всего лишь на долю секунды.Однако у меня такое ощущение, что это какая-то проблема связывания, поскольку я тоже использую SDL, а sdl2-config --cflags/-libs использует -D_REENTRANT, в то время как gtk, похоже, хочет -pthread-переключатель для gcc, так как сообщения gdb вылетают из nptl/thread stuff, я просто думаю о каком-то конфликте здесь? Но, хорошо, я попробую вашу идею, все равно выглядит более полированным решением, я посмотрю, и скажите +, согласитесь, было ли это oK! БЛАГОДАРЯ! – LGB
@ duskwuff Хорошая идея, отчасти: я проверю источник зенитности :-) Может быть, это помогает создать простой файлообменник, правильный путь (TM). :) Я бы не хотел слишком много использовать внешние программы, если это возможно ... – LGB