我正在为学校的家庭作业项目制作一个简单的应用程序,并且尝试添加图像,但是每次执行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;
没有错误消息,因为整个过程要么完全崩溃要么停止响应,所以我无法提供类似的信息。任何帮助,将不胜感激。谢谢您的宝贵时间。
答案 0 :(得分:0)
首先,您不需要使用设计器来完成如此简单的任务。此外,设计人员始终将您与给定的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();
}
}
要使该代码正常工作,您必须执行以下操作:
下载图像。我下载了有关自动机器人PROWL的图像,并将其命名为prowl.jpg,但是您当然可以选择任何想要的东西。
通过MonoDevelop在项目中创建目录(右键单击该项目,然后选择“新文件夹”)。
将图像复制到该文件夹:右键单击新创建的文件夹(我称该文件夹为“ res”),然后选择“添加文件”,在MonoDevelop询问要执行的操作时将图像复制到该文件夹。
右键单击图像,然后选择“快速属性>>复制到输出目录”。这将使BuildExternalImage()
方法起作用。如果您不打算使用外部图像,则可以跳过此步骤。考虑到这种方式,您必须使用可执行文件分发映像(在名为“ res”的目录中)。
右键单击该图像,然后选择“构建操作>> EmbbeddedResource”。这将使方法BuildEmbeddedImage()
起作用。该映像将位于您的可执行文件内,无需担心其他任何事情。唯一需要注意的是,在BuildEmbeddedImage
中,您不必创建带有项目名称,带有图像的目录名称以及名称的字符串,而不必读取“ CSShowImage.res.prowl.jpg”这一行。图片的名称。例如,如果您的项目名为“ HomeWork”,您将文件夹创建为“ res”,并且图像是“ myfamily.jpg”,那么结果字符串将是“ HomeWork.res.myfamily.jpg”
如果您坚持使用设计器,那么:
在Gtk#2.0部分的MonoDevelop中创建一个新项目
转到MainWindow.cs并进入设计器。
从正在设计的窗口内的工具箱中拖放一个Image小部件。 MonoDevelop会抱怨您使用小部件而不是容器(例如VBox),然后在其中使用小部件。继续选择哪个选项。
选择图像小部件,然后转到属性,展开“图像属性”。在pixbuf中,单击“ ...”按钮。转到资源文件夹。点击“添加”,然后选择您的图片。 MonoDevelop将为您完成繁重的工作,并且图像将立即出现在设计器中。
单击“运行”。
老实说,MonoDevelop在第一次执行时崩溃,但是在再次打开项目时看起来很稳定。
希望这会有所帮助。