Thread canvas rect item callback Frage
(5 answers)
Opened by FoolAck at 2009-01-11 21:51
Moin.
Ich möchte ein callback genau dann ausgeführt haben, wenn die Maus in ein Rectitem gelangt (<Enter>) und gleichzeitig ein Mausbutton gedrückt ist. Hier mein Versuch: 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 #!/usr/bin/env perl use strict; use warnings; use Tk; $|++; my $data = { pressed => 0, }; my $mw = MainWindow->new(); my $canvas = $mw->Canvas(-width => 200, -height => 200)->pack(); $canvas->CanvasBind('<ButtonPress>', sub {$data->{pressed} = 1; print "pressed\t";}); $canvas->CanvasBind('<ButtonRelease>', sub {$data->{pressed} = 0; print "released\n";}); my @items; for my $x (1 .. 4) { my $x1 = $x * 25; my $y1 = $x1; my $x2 = $x1 + 25; my $y2 = $y1 + 25; $items[$x - 1] = $canvas->createRectangle($x1, $y1, $x2, $y2, -fill => 'red', -width => 0); } $canvas->bind($items[$_], '<Enter>', sub {if ($data->{pressed}) {print "wtf\t"}}) for 0 .. 3; MainLoop(); Das Script gibt "pressed" und "released" wie erwartet aus. Aber "wtf" nur, wenn man den Mausbutton innerhalb eines Rects released, in das man vorher ge"Enter"t ist während ein Mausbutton gedrückt war. "Enter"t man (mit gedrücktem Mausbutton) mehrere Mal das Selbe Rectitem, so gibt das Script entsprechend oft "wtf" aus, allerdings auch erst beim release-Event. (Aus verschiedensten Kombis (außerhalb eines rects drücken, in verschiedene rects "Enter"n und dann außerhalb eines rects wieder releasen etc.pp.) werd ich irgendwie auch nicht schlauer, eher noch verwirrter.) Gebe ich statt nur "wtf" auch "wtf $data->{pressed}" aus, wird immer "wtf 1" ausgegeben. Wo liegt mein Denkfehler? edit: hab mal output-buffering ausgestellt. Erstmal: die wtfs die kommen jetzt zumindest (größtenteils) zur richtigen Zeit. Aber: Es kommt nur, wenn man 1. einen Mausbutton in einem rect drückt und dann immer wieder in das Selbe rect "Enter"t. (Dann kommts "direkt", also zeitlich korrekt.) 2. wenn man außerhalb eines rects einen Mausbutton drückt und dann in ein rect eintritt und dort released. (Dann kommts erst mit dem release-Event. Und dann auch maximal ein "wtf".) 3. eine Mischung aus beiden: man drückt einen Mausbutton innerhalb rects A und "Enter"t dann rect B. released man dann innerhalb von rect B kommt ein zusätzliches "wtf" (zu denen, die eventuell schon von rect A kamen) dazu, allerdings auch erst wie bei 2. mit dem release-Event. |