gpt4 book ai didi

c# - 当我使用属性窗口中的 pixbuf 选项将图像添加到 gtk 窗口时,Monodevelop 不断崩溃

转载 作者:行者123 更新时间:2023-12-03 16:04:27 25 4
gpt4 key购买 nike

我正在为学校的家庭作业项目制作一个简单的应用程序,并且我正在尝试添加一个图像,但是每次我做 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;

没有错误消息,因为整个事情要么彻底崩溃,要么停止响应,所以我无法提供类似的东西。任何帮助,将不胜感激。感谢您的时间。

最佳答案

首先,您不需要使用设计器来完成如此简单的任务。此外,设计器总是将您与给定的 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 并进入设计器。
  • 从正在设计的窗口内的工具箱中拖放一个图像小部件。 MonoDevelop 会提示您使用小部件而不是容器(例如 VBox),然后在其中使用小部件。继续使用任何选项。
  • 选择图像小部件并转到属性,展开“图像属性”。在 pixbuf 中,单击“...”按钮。转到资源文件夹。单击“添加”并选择您的图像。 MonoDevelop 将为您完成繁重的工作,图像将立即出现在设计器中。
  • 点击“运行”。

  • 老实说,MonoDevelop 在第一次执行时就崩溃了,但在再次打开项目时似乎很稳定。

    希望这可以帮助。

    关于c# - 当我使用属性窗口中的 pixbuf 选项将图像添加到 gtk 窗口时,Monodevelop 不断崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56259760/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com