Monodevelop продолжает падать, когда я добавляю изображение в окно gtk, используя опцию pixbuf в окне свойств - PullRequest
1 голос
/ 22 мая 2019

Я делаю простое приложение для школьного домашнего задания и пытаюсь добавить изображение, но каждый раз, когда я делаю, происходит сбой IDE, и если мне как-то удается его скомпилировать, когда я вхожу в это окно в целом программа вылетает. Это не дает мне ошибки, и когда я открываю его в терминале, ничего не выводится.

Я пытался использовать включенные значки, я пытался импортировать его в каталог проекта и пытался получить к нему доступ в виде ссылки на файл, но все безрезультатно.

Это раздел сборки, который обрабатывает файлы изображений, но я действительно не знаю, что делаю, так как это первое приложение gtk, которое я сделал. Я могу предоставить дополнительные фрагменты кода по мере необходимости. Я не могу привести примеры кода, когда изображение загружается в программу, потому что оно мгновенно падает.

// Container child hbox6.Gtk.Box+BoxChild
            this.image1 = new global::Gtk.Image();
            this.image1.Name = "image1";
            this.hbox6.Add(this.image1);
            global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.hbox6[this.image1]));
            w6.Position = 0;
            w6.Expand = false;
            w6.Fill = false;
            // Container child hbox6.Gtk.Box+BoxChild
            this.image2 = new global::Gtk.Image();
            this.image2.Name = "image2";
            this.hbox6.Add(this.image2);
            global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox6[this.image2]));
            w7.Position = 1;
            w7.Expand = false;
            w7.Fill = false;
            this.hbox3.Add(this.hbox6);
            global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.hbox3[this.hbox6]));
            w8.Position = 0;
            w8.Expand = false;
            w8.Fill = false;
            // Container child hbox3.Gtk.Box+BoxChild
            this.hbox4 = new global::Gtk.HBox();
            this.hbox4.Name = "hbox4";
            this.hbox4.Spacing = 6;
            // Container child hbox4.Gtk.Box+BoxChild
            this.image3 = new global::Gtk.Image();
            this.image3.Name = "image3";
            this.hbox4.Add(this.image3);
            global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.hbox4[this.image3]));
            w9.Position = 0;
            w9.Expand = false;
            w9.Fill = false;
            // Container child hbox4.Gtk.Box+BoxChild
            this.image4 = new global::Gtk.Image();
            this.image4.Name = "image4";
            this.hbox4.Add(this.image4);
            global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.hbox4[this.image4]));
            w10.Position = 1;
            w10.Expand = false;
            w10.Fill = false;

Нет сообщений об ошибках, потому что все это либо просто падает, либо перестает отвечать, поэтому я не могу ничего подобного представить. Любая помощь будет оценена. Спасибо за ваше время.

1 Ответ

0 голосов
/ 25 июня 2019

Прежде всего, вам не нужно использовать конструктор для такой простой задачи.Более того, дизайнер всегда связывает вас с данной IDE (в данном случае MonoDevelop).Графические наборы инструментов гораздо более интуитивно понятны, чем раньше, и часто бывает просто понять, как с ними работать.

Это весь код проекта, который просто показывает изображение в окне.

class MainWindow: Gtk.Window {
    public MainWindow()
        :base(Gtk.WindowType.Toplevel)
    {
        this.Build();


        this.DeleteEvent += (o, args) => Gtk.Application.Quit();
    }

    void Build()
    {
        var imgContainer = this.BuildEmbeddedImage();

        this.Add( imgContainer );
    }

    Gtk.Image BuildExternalImage()
    {
        return new Gtk.Image( "res/prowl.jpg" );
    }

    Gtk.Image BuildEmbeddedImage()
    {
        var pixbufImage = new Gdk.Pixbuf(
            System.Reflection.Assembly.GetEntryAssembly(),
            "CSShowImage.res.prowl.jpg");

        return new Gtk.Image( pixbufImage );
    }
}

class Ppal
{
    [System.STAThread]
    static void Main()
    {
        Gtk.Application.Init();
        new MainWindow().ShowAll();
        Gtk.Application.Run();
    }
}

Чтобы этот код работал, вы должны сделать следующее:

  1. Скачать изображение.Я скачал изображение об автоботе PROWL и назвал его prowl.jpg, но вы, конечно, можете выбрать все, что захотите.

  2. Создайте каталог в своем проекте с помощью MonoDevelop (справа -щелкните проект и выберите «новая папка»).

  3. Скопируйте изображение в эту папку: щелкните правой кнопкой мыши вновь созданную папку (я назвал эту папку «res») и выберите ««Добавить файлы», копируя изображение в эту папку, когда MonoDevelop спрашивает, что делать.

  4. Щелкните правой кнопкой мыши изображение и выберите «Быстрые свойства >> Копировать в выходной каталог».Это заставит метод BuildExternalImage() работать.Вы можете пропустить этот шаг, если не планируете использовать внешнее изображение.Учтите, что таким образом вам придется распространять образ (в каталоге с именем «res») вместе с исполняемым файлом.

  5. Щелкните правой кнопкой мыши по изображению и выберите «build»действие >> EmbbeddedResource ".Это заставит метод BuildEmbeddedImage() работать.Образ будет внутри вашего исполняемого файла, не нужно беспокоиться ни о чем другом.Единственное предостережение заключается в том, что в BuildEmbeddedImage вместо строки, читающей «CSShowImage.res.prowl.jpg», необходимо создать собственную строку с именем проекта, именем каталога с изображением и именемизображения.Например, если ваш проект называется «HomeWork», вы создали папку как «res», а ваше изображение - «myfamily.jpg», тогда полученная строка будет «HomeWork.res.myfamily.jpg»

Если вы настаиваете на использовании дизайнера, то:

  1. Создайте новый проект в MonoDevelop раздела Gtk # 2.0

  2. Перейдите в MainWindow.cs и зайдите в конструктор.

  3. Перетащите виджет изображения из панели инструментов в проектируемое окно.MonoDevelop будет жаловаться на то, что вы используете виджет вместо контейнера (например, VBox), а затем виджет внутри него.Идите вперед с любым параметром.

  4. Выберите виджет изображения и перейдите в свойства, разверните «свойства изображения».В pixbuf нажмите кнопку «...».Перейдите в папку ресурсов.Нажмите «Добавить» и выберите свое изображение.MonoDevelop сделает за вас тяжелую работу, и изображение появится в конструкторе прямо сейчас.

  5. Нажмите «Выполнить».

Длячестно говоря, MonoDevelop аварийно завершил работу при первом запуске, но при повторном открытии проекта он оказался стабильным.

Надеюсь, это поможет.

...