4 votes

Démarrer avec Mono, C# et Glade# : Comment faire apparaître une fenêtre ?

J'ai essayé de m'initier à Mono et GTK# (je viens d'un milieu de programmation d'interfaces graphiques Qt/C++) et j'ai décidé de commencer par une interface graphique de test très simple.

J'ai installé le programme d'installation MS Windows Mono/GTK# et ensuite, après avoir constaté que le lien du menu Démarrer vers Glade ne fonctionnait pas (car il ne semblait pas être inclus dans le paquet), j'ai utilisé le programme d'installation binaire Windows "Glade with GTK+" du site Web de Glade.

J'ai ensuite créé une interface graphique très simple dans Glade (en bas de cet article) et écrit mon premier bout de code C# pour l'afficher. Cependant, cela ne semble pas fonctionner correctement.

Le message "Hello, World !" est correctement imprimé sur la console, puis le programme se bloque sans que la fenêtre n'apparaisse ou qu'aucun message d'erreur ne soit imprimé. Il semble que la fenêtre ait été créée et que la boucle d'événements ait démarré, mais qu'elle ne soit pas rendue visible. J'ai essayé de supprimer le premier null de la new Glade.XML et ne pas inclure le fichier glade comme ressource, mais cela n'a fait aucune différence.

J'ai également essayé de remplacer le xml de l'interface graphique de Glade par celui de la page le GtkSharpBeginnersGuide sur le site web de mono (et en changeant wndTestWindow a window1 dans le code C#) et il semble fonctionner parfaitement, ce qui implique qu'il y a un problème avec mon Glade XML. Cependant, j'ai du mal à comprendre ce qui ne va pas avec le XML créé par mon installation Glade. Quelqu'un peut-il me donner des suggestions ?

Glade GUI :

<?xml version="1.0"?>
<glade-interface>
  <!-- interface-requires gtk+ 2.12 -->
  <!-- interface-naming-policy project-wide -->
  <widget class="GtkWindow" id="wndTestWindow">
    <property name="title" translatable="yes">Test Window</property>
    <property name="window_position">center</property>
    <child>
      <widget class="GtkVBox" id="vboxTopLevel">
        <property name="visible">True</property>
        <property name="orientation">vertical</property>
        <child>
          <widget class="GtkHBox" id="hboxComboList">
            <property name="visible">True</property>
            <child>
              <widget class="GtkLabel" id="lblList">
                <property name="visible">True</property>
                <property name="label" translatable="yes">Here's a list:</property>
              </widget>
              <packing>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <widget class="GtkComboBox" id="cmbList">
                <property name="visible">True</property>
              </widget>
              <packing>
                <property name="position">1</property>
              </packing>
            </child>
            <child>
              <widget class="GtkButton" id="btnList">
                <property name="label" translatable="yes">Do something</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
              </widget>
              <packing>
                <property name="position">2</property>
              </packing>
            </child>
          </widget>
          <packing>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <widget class="GtkHButtonBox" id="hbtnboxButtonRow">
            <property name="visible">True</property>
            <child>
              <widget class="GtkButton" id="btnOK">
                <property name="label">gtk-ok</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <property name="use_stock">True</property>
              </widget>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <widget class="GtkButton" id="btnCancel">
                <property name="label">gtk-cancel</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <property name="use_stock">True</property>
              </widget>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">1</property>
              </packing>
            </child>
          </widget>
          <packing>
            <property name="position">1</property>
          </packing>
        </child>
      </widget>
    </child>
  </widget>
</glade-interface>

Code de test C# :

using Glade;
using Gtk;
using System;

class TestApplication
{
    static void Main(string[] args)
    {
        System.Console.Write("Hello, World!\n");
        new TestApplication(args);
    }

    public TestApplication(string[] args)
    {
        Gtk.Application.Init();

        Glade.XML gxml = new Glade.XML(null, "test_mono.glade", "wndTestWindow", null);
        gxml.Autoconnect(this);
        Gtk.Application.Run();
    }
}

Compilé et exécuté avec :

mcs -pkg:glade-sharp-2.0 -resource:test_mono.glade test_mono.cs
mono .\test_mono.exe

Versions :

Windows : XP Service Pack 3 Glade : 3.6.7 MCS version 2.6.7.0 Mono et GTK# sont installés en utilisant mono-2.6.7-gtksharp-2.12.10-win32-2.exe sur le site web de Mono.

Compilé et testé à la fois avec cygwin et avec l'invite de commande "Mono-2.6.7".

8voto

stoft Points 317

Essayez d'ajouter <property name="visible">True</property> à votre widget Root pour qu'il se lise comme suit :

<?xml version="1.0"?>
<glade-interface>
  <!-- interface-requires gtk+ 2.12 -->
  <!-- interface-naming-policy project-wide -->
  <widget class="GtkWindow" id="wndTestWindow">
    <property name="visible">True</property>
    <property name="title" translatable="yes">Test Window</property>
    <property name="window_position">center</property>
    <child>

Dans Glade, la propriété se trouve sous l'onglet Propriétés communes de la fenêtre.

1voto

jpobst Points 8928

Vous pourriez envisager de télécharger MonoDevelop pour Windows. Gtk# n'a pas vraiment utilisé Glade depuis longtemps. Il utilise généralement Stetic, qui a un concepteur intégré dans MonoDevelop.

http://monodevelop.com/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X