Thread Tk-Raten: Linie zwischen zwei Boxen ziehen (3 answers)
Opened by pktm at 2010-09-05 16:05

pktm
 2010-09-05 16:05
#141193 #141193
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Liebe alle!

Es gab ja mal das Rätsel der Woche. Das hier ist eventuell für den ein oder anderen sowas ähnliches :)

Hier eine Aufgabenstellung, an der ich mich gerade versuche:

Gegeben eine Canvas, die zwei Boxen enthält, die Text enthalten.
Zwischen diesen beiden Boxen soll man nun eine Linie ziehen können.

Dazu soll der Nutzer auf eine Box klicken können, die Maustaste gedrückt halten und auf der anderen Box loslassen. Im Prinzip ist das drag&drop oder?
Wenn die Maus irgendwo losgelassen wird, wo keine Box ist, oder Ausgangsbox und Zielbox identisch sind, dann soll die Linie nicht gemalt werden.
Ich möchte natürlich wissen, welche beiden Boxen miteinander verbunden wurden.
Eine Ausgabe mit print() reicht dazu erstmal.

Es sollte egal sein, ob an eine Box auf der linken Seite mit einer auf der rechten Seite verbindet oder andersherum. Allerdings soll es nur möglich sein, zwei verschiedene Seiten miteinander zu verbinden. Die Information, auf welcher Seite eine Box steht, wird über ein Tag markiert (left / right).

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
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper qw/Dumper/;
use Tk;

my $mw = tkinit();

my $c = $mw->Canvas()->pack(-expand => 1, -fill => 'both',);

# -------------------------------------------------------------
# --- left box
my $left = $c->createText(
        50, 50,
        -text => 'left',
        -tags => [qw/left text id1/]
);
my @left_bbox = $c->bbox('left', 'id1');
my $padding = 3;
$c->createRectangle(
        $left_bbox[0] - $padding, $left_bbox[1] - $padding,
        $left_bbox[2] + $padding, $left_bbox[3] + $padding,
        -fill => 'green',
        -tags => [qw/left box id1/]
);
$c->raise('text', 'box');

# -------------------------------------------------------------
# --- right box
my $right = $c->createText(
        250, 50,
        -text => 'right',
        -tags => [qw/right text id5/]
);
my @right_bbox = $c->bbox('right', 'id5');
$c->createRectangle(
        $right_bbox[0] - $padding, $right_bbox[1] - $padding,
        $right_bbox[2] + $padding, $right_bbox[3] + $padding,
        -fill => 'yellow',
        -tags => [qw/right box id5/]
);
$c->raise('text', 'box');


$mw->MainLoop();


Vielleicht mag ja wer mitraten, wie das geht. Mich würden auch Lösungen mit anderen GUI-Systemen interessieren, z.B. Wx-Widgets oder GTk2.
Wenn ich eine Lösung fertig habe, poste ich sie hier.
http://www.intergastro-service.de (mein erstes CMS :) )

View full thread Tk-Raten: Linie zwischen zwei Boxen ziehen