Schrift
[thread]12903[/thread]

Glade2 (GUI-Generator) - Komplette Container Clonen (Vbox, Hbox .. etc) (Seite 2)

Leser: 3


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
topeg
 2008-12-13 21:05
#117206 #117206
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Also bei mir funktioniert es:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/perl
use strict;
use warnings;
use Gtk2 -init;
use Gtk2::GladeXML;

my $gfile='test.glade';

my $count=0;

my $glade=Gtk2::GladeXML->new($gfile,'mainwin');
$glade->signal_autoconnect_from_package('main');
$glade->get_widget('mainwin')->show_all();
Gtk2->main;

sub do_add_template
{
  my $pos=$count;
  my $template=Gtk2::GladeXML->new($gfile,'hbox_template');
  my $label=$template->get_widget('label_info');
  $label->set_label('');
  $template->get_widget('button_template')->signal_connect(clicked =>
         sub{ $label->set_label(sprintf("Position: %02u",$pos)); });
  my $widget=$template->get_widget('hbox_template');
  $glade->get_widget('vbox_insert')->pack_start($widget, 0, 1, 0);
  $count++;
}

sub do_ende
{ Gtk2->main_quit; }


Die Glade-Datei:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Sat Dec 13 19:57:21 2008 -->
<glade-interface>
<widget class="GtkWindow" id="mainwin">
<signal name="destroy" handler="do_ende"/>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="border_width">5</property>
<property name="spacing">5</property>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkViewport" id="viewport1">
<property name="visible">True</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<child>
<widget class="GtkVBox" id="vbox_insert">
<property name="visible">True</property>
<property name="spacing">5</property>
<child>
<placeholder/>
</child>
</widget>
</child>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkButton" id="button2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="do_add_template"/>
<child>
<widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="spacing">5</property>
<child>
<widget class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-about</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">Template Hinzufügen</property>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="stock">gtk-about</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</widget>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">gtk-quit</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="do_ende"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</widget>
</child>
</widget>
<widget class="GtkWindow" id="template">
<child>
<widget class="GtkHBox" id="hbox_template">
<property name="visible">True</property>
<property name="spacing">5</property>
<child>
<widget class="GtkLabel" id="label_info">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">xxx</property>
</widget>
</child>
<child>
<widget class="GtkButton" id="button_template">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">gtk-about</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="do_info"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>


und noch eine etwas objektorientierte Variante:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl
use strict;
use warnings;
use Gtk2 -init;
use Gtk2::GladeXML::Simple;

my $gfile='test.glade';
my $gmain=mainwin->new($gfile);
$gmain->run();

{
  package mainwin;
  use base 'Gtk2::GladeXML::Simple';

  sub new
  {
    my $class=shift;
    my $gfile=shift;
    my $self=bless($class->SUPER::new($gfile,'mainwin'), $class);
    $self->{GLADEFILE}=$gfile;
    $self->{COUNT}=0;
    $self->{mainwin}->show_all();
    return $self;
  }

  sub do_ende
  { Gtk2->main_quit; }

  sub do_add_template
  {
    my $self=shift;
    $self->{COUNT}++;
    my $template=template->new($self->{GLADEFILE},$self->{COUNT});
    my $widget=$template->get_template_widget();
    $self->{vbox_insert}->pack_start($widget, 0, 1, 0);
  }
}

{
  package template;
  use base 'Gtk2::GladeXML::Simple';

  sub new
  {
    my $class=shift;
    my $gfile=shift;
    my $pos=shift;
    my $self=bless($class->SUPER::new($gfile,'hbox_template'), $class);
    $self->{POSITION}=$pos;
    $self->{label_info}->set_label('');
    return $self;
 }

  sub do_info
  {
    my $self=shift;
    $self->{label_info}->set_label(sprintf("Position: %02u",$self->{POSITION}));
  }

  sub get_template_widget
  { return shift()->{hbox_template}; }
}
IceRage
 2008-12-14 17:29
#117236 #117236
User since
2008-09-07
93 Artikel
BenutzerIn
[default_avatar]
Jo sehr geil, funktioniert so ^^. Hatte das erst nicht gerafft, dass du ein zweites fenster als container für das template benutzt hast. Aber jetzt weiß ich auch warum, du den xml file mit gepostet hast. daraus geht das ja alles hervor.

Thx, das geht echt gut so ;-)

Gruß, IceRage
IceRage
 2008-12-15 13:58
#117247 #117247
User since
2008-09-07
93 Artikel
BenutzerIn
[default_avatar]
Also wie gesagt, hat alles sehr gut geklappt. Jetzt muss ich aber noch mal ganz blöd fragen: Wie würde ich denn, die hinzugefügten Templates wieder wegbekommen. Habe das schon so verschiedenen Methoden versucht, destroy, remove, hide, hide_all usw ... hat aber alles nicht so geklappt, wie ich es wollte.
topeg
 2008-12-15 20:24
#117268 #117268
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Code (perl): (dl )
1
2
3
4
5
6
sub do_remove_all_templates
{
  my $box=$glade->get_widget('vbox_insert');
  for my $widget ($box->get_children())
  { $box->remove($widget); }
}


Ist hoffentlich selbsterklärend.
Funktioniert bei allen Widgets die von "Gtk2::Container" erben.
IceRage
 2008-12-16 07:10
#117271 #117271
User since
2008-09-07
93 Artikel
BenutzerIn
[default_avatar]
Ja verstehe ich, vielen Dank.

Gruß, IceRage
IceRage
 2008-12-16 13:13
#117273 #117273
User since
2008-09-07
93 Artikel
BenutzerIn
[default_avatar]
Hat alles super geklappt, besten Dank für deine Informationen ...

.. hätte da jetzt allerdings noch ein Problem ^^. Eine Boardsuche gibt es hier ja leider nicht, sonst würde sich die Frage vielleicht erübrigen. Möglicherweise hat die Frage auch nicht direkt etwas mit dem Topic zu tun, allerdings weiß ich aus verschiedenen recherchen mittlerweile, dass die Erstellung von Executables wohl speziell zu handlen ist. Nach allem was ich bis jetzt gelesen habe, scheint es einfach in diesem Fall, also unter Verwendung von glade, nicht einfach mit
Code: (dl )
pp -o packed.exe source.pl
möglich zu sein, ein Executable zu erstellen. Verschiedene Versuche sind auch schon fehl geschlagen.

Also weder die Verwendung von perlcc, noch verschiedene Versuche mit make .. haben bis jetzt Erfolg gebracht. Perlcc soll ja angeblich noch nie richtig funktioniert haben, weshalb sehr häufig zu PAR, bzw. zu pp (perl pack) geraten wird. Nachdem ich nun PAR über perl -MCPAN -e shell installiert habe, kann ich allerdings nicht auf pp in der shell zu greifen. habe auch schon das debian repository durchsucht, und sonst alles mögliche versucht, geht aber nix weiter.

Ich frage mich langsam, ob es überhaupt möglich ist, Executables zu erstellen, die auf Linux und auf Windows laufen können. Ist mir schon klar, dass keine Exe auf Linux laufen wird, mal mit Ausnahme in wine, aber das bringt mich auch zu einer Frage, die mich sehr beschäftigt: Wenn ich zb. ein Modul benutze, dass es für activePerl nicht gibt, kann ich das dann überhaupt so in ein Executable packen, damit es dann standalone in windows läuft?


Also hier noch mal genau, was ich gern wissen würde:
1. Wie/Womit erstelle ich ein Executable unter Linux (debian)? (PAR, pp, perlcc, make, autogen.sh ???)

2. Wie/Womit erstelle ich ein Executable unter Windows?

3. Ist es möglich ein Executable auf Windows/Linux zu erstellen, dass auf Windows/Linux läuft trotzdem Module verwendet werden, die unter ActivePerl nicht verfügbar sind?

Als Windows habe ich WindowsXP ... Linux wie gesagt Debian Etch.


Vielen Dank, schon mal im Vorrraus.

Gruß, IceRage
topeg
 2008-12-16 19:53
#117302 #117302
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Also ich habe es bei meinen Gtk-Scripten so gemacht:
1. relative Pfade im Script anpassen:
Code (perl): (dl )
$path=$ENV{PAR_TEMP}."/inc/$path" if($ENV{PAR_TEMP});

2. Alles zuammenpacken:
Code: (dl )
pp -p -I own/modules/ -a application.glade -a application.conf application.pl

3. Par-datei ist Zip-Archiv. Gebenfalls öffnen und sonstige Dateien hineinpacken. (waren bei mir Hilfedokus) Der Par-Packer kann keine Ordner rekusrsiv hinzufügen.

4. Programm erzeugen:
Code: (dl )
pp -o application a.par


Wenn man dann das Programm ausführt entpackt es das Archiv nach "/tmp/par-username/cache-random/"
einfach mal rein schauen und sehen wo was liegt, und danach die Pfade anpassen.

Mit Windows kann ich dir nicht weiterhelfen.
Stell die Frage am besten nochmal als eigenen Thread.
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2008-12-13 17:36.