Schrift
[thread]10530[/thread]

Widgets auf DrawingArea zeichnen

Leser: 1


<< >> 8 Einträge, 1 Seite
philbert
 2007-10-06 21:26
#100426 #100426
User since
2007-09-21
7 Artikel
BenutzerIn
[default_avatar]
Ich schreibe gerade an einem kleinen Tool, dessen Haupteil aus einer Drawing Area besteht auf die ich verschiedene Objekte wie bei einem Graphen zeichne (zugrundeliegende Struktur ist ein Baum). Meine Frage:

Ist es möglich auf diese Objekte ein Gtk2::Entry (z.B.) zu zeichnen oder muss ich das nochmal komplett selber nachprogrammieren?

Ziel ist ein Aufbau wie der von BlueJ (http://life.upb.de/upload/4fa4346dcf9d5368871ecdde...)
nur mit direkt auf der Zeichenfläche editierbaren Werten.

Ich glaube ich freu mich nicht auf die Antwort, bedanke mich aber trotzdem schonmal für jede Hilfe,

Paul Hilbert
topeg
 2007-10-07 21:44
#100456 #100456
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Hat etwas gedauert. Habe das selber noch nicht gemacht...

Ich Male hier auf den Hintergrund des Widget. (habe Gtk2::Fixed verwendet, da man darin Widgets frei positionieren kann, was du wohl auch wolltest.)
Die mögliche Grössenveränderung des Fensters habe ich auch mal eingebaut. :-)
ImageMagick benutze ich nur, um das Bild zu malen.

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
63
64
65
66
67
68
69
#!/usr/bin/perl

use strict;
use warnings;

use Gtk2 -init;
use Image::Magick;

my $fixed = Gtk2::Fixed->new;
$fixed->set_has_window(1); # wichtig, damit das Widget eine Windowid bekommt.
$fixed->signal_connect (expose_event => \&redraw);

my $button=Gtk2::Button->new_with_label('TEST');
$button->set_size_request(70,30);
$button->signal_connect( clicked => sub{ $fixed->move($button, 100, 100); } );

$fixed->put($button, 50, 50);

my $win = Gtk2::Window->new;
$win->set_title ('TEST');
$win->set_border_width (10);
$win->set_default_size (300, 300);
$win->signal_connect (delete_event => sub { Gtk2->main_quit; });
$win->add ($fixed);

$win->show_all; # aufrufen sonst kann die WindowID nicht ermittelt werden!
redraw();

Gtk2->main;
exit(0);

################################################################
# Funktionen ###################################################
################################################################
sub redraw
{
 my $gdkwin=$fixed->window; # windowID ermitteln
 my $allocation = $fixed->allocation;
 my ($width,$height)=($allocation->width,$allocation->height);
 my $magick=create_image($width,$height);
 my $pixmap=magick_to_pixmap($magick);
 $gdkwin->set_back_pixmap($pixmap);
}


sub magick_to_pixmap
{
 my $magick=shift;
 my $depth=8;
 my @data=$magick->ImageToBlob(magick=>'RGBA', colorspace=>'RGB', depth=>$depth);
 my $b=$magick->Get('columns');
 my $h=$magick->Get('rows');
 my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_data ($data[0],'GDK_COLORSPACE_RGB',1,$depth,$b,$h,$b*4);
 my $pixmap = $pixbuf->render_pixmap_and_mask(0);
 return $pixmap;
}

sub create_image
{
 my ($width,$heigth) = @_;
 my $img=Image::Magick->new;
 $img->Set(size=>$width.'x'.$heigth);
 my $mpx=int($width/2);
 my $mpy=int($heigth/2);
 $img->Read('xc:white');
 $img->Draw(fill=>'red', stroke=>"black", strokewidth=>5, primitive=>'circle', points=>"$mpx,$mpy ".($mpx-60).",$mpy");
 $img->Annotate(text=> '!', stroke=>"black", fill=>"black", x=>($mpx-15), y=>($mpy+35), pointsize=>100, font=>"arial");
 return $img;
}
pktm
 2007-10-07 22:26
#100459 #100459
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Bei mir kommt der Fehler:
Quote
Can't locate object method "signal_connect" via package "Gtk2::Fixed" at C:\Perl\Scripten\gtk_draw_tingy.pl line 11.


Würde mir das aber gerne einmal ansehen, da ich noch nie mit Gtk gearbeitet habe. Was muss ich tun damit das läuft?
http://www.intergastro-service.de (mein erstes CMS :) )
topeg
 2007-10-07 22:56
#100460 #100460
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Hmm seltsam. Kommentiere die Zeile erstmal aus, sie sorgt dafür, dass das Hintergundbild neu erzeugt und eingefügt wird, wenn sich das Fenster verändert. Es ist nicht essenziell.

Aber seltsam ist es schon, da "signal_connect" eine Methode von "Gtk2::Gdk::Objekt" und "Gtk2::Fixed" erbt diese Klasse.

Welche Version von PerlGtk hast du? Möglicherweise hilft ein Update...
pktm
 2007-10-07 23:05
#100461 #100461
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Meine Version ist 1.062, ein Update ist nicht drin, da ich auf Windows arbeite (ja, das gibt es :)) und mir gerade eben die ppd's von sf.net gezogen habe.

Nachdem ich alle signal_connect() ausgeklammert hatte ging es. Benutzt Gtk die vom System bereit gestellten Widgets oder eigene?
http://www.intergastro-service.de (mein erstes CMS :) )
topeg
 2007-10-07 23:29
#100463 #100463
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Wie es scheint, ist das mit "signal_connect" ein bekanntes Problem. um ein Update wirst du nicht drum herum kommen, denke ich. Bei mir läuft Glib/Gtk2 1.140 (Linux). Der Fehler wurde in Version 1.120 behoben, so las ich gerade. Wie es scheint gibt es nur die 1.100 Version auf http://gtk2-perl.sourceforge.net/win32
Versuch die mal zu installieren:
Code: (dl )
1
2
ppm install http://gtk2-perl.sourceforge.net/win32/ppm/Glib.ppd
ppm install http://gtk2-perl.sourceforge.net/win32/ppm/Gtk2.ppd
pktm
 2007-10-08 00:09
#100465 #100465
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Danke für die Links, habs aktualisiert, bekomme aber leider noch den selben Fehler :-/
http://www.intergastro-service.de (mein erstes CMS :) )
philbert
 2007-10-08 02:56
#100470 #100470
User since
2007-09-21
7 Artikel
BenutzerIn
[default_avatar]
Wundervoll! Das hilft zu 100%.

Sorry das ich mich erst jetzt bedanken kann ;)
<< >> 8 Einträge, 1 Seite



View all threads created 2007-10-06 21:26.