Schrift
[thread]10344[/thread]

Scrolled - Canvas mit Mausrad scrollen - nicht ? (Seite 2)

Leser: 2


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Gast Gast
 2007-09-12 12:14
#99364 #99364
Prima. Danke Renee!

Ich hätte es fast selbst geschafft ^_^
Gast Gast
 2007-09-12 11:11
#99366 #99366
ptk+2007-09-11 21:32:33--
Ach, falscher Aufruf. Versuch mal stattdessen
Code: (dl )
$mw->MouseWheelBind("Tk::Canvas")
.
Alternativ auch nur "Canvas" oder "canvas".


ich gebs auf :(

Es geht leider nicht. Selbst hier:
Code (perl): (dl )
$mw->bind($c, '<MouseWheel>', sub { print "Test\n"; });


gehts nicht. Keine Reaktion...

Ich vermute mal das liegt an Maustreiber. Es gibt hier so einige Programme, wo bei bestimmten Widgets Scrollen einfach nicht funktioniert. Bspw. VBA-Editor von M$. Da kann man auch nichts machen
Gast Gast
 2007-09-12 11:28
#99367 #99367
Gast+2007-09-12 09:11:10--
ptk+2007-09-11 21:32:33--
Ach, falscher Aufruf. Versuch mal stattdessen
Code: (dl )
$mw->MouseWheelBind("Tk::Canvas")
.
Alternativ auch nur "Canvas" oder "canvas".


ich gebs auf :(

Es geht leider nicht. Selbst hier:
Code (perl): (dl )
$mw->bind($c, '<MouseWheel>', sub { print "Test\n"; });


gehts nicht. Keine Reaktion...

Ich vermute mal das liegt an Maustreiber. Es gibt hier so einige Programme, wo bei bestimmten Widgets Scrollen einfach nicht funktioniert. Bspw. VBA-Editor von M$. Da kann man auch nichts machen


zu früh aufgegeben :)

so kann man Scrolling zumindest simulieren:
Code (perl): (dl )
1
2
3
$mw->bind($mw, '<MouseWheel>', 
        sub { $c->yviewScroll(1 => 'units'); }
);


jetzt muss ich nur noch rausfinden, in welche Richtung es gedreht worden (hoch oder runter). Hat vielleicht jemand eine Idee?
renee
 2007-09-12 12:09
#99368 #99368
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use warnings;
use strict;
use Tk;

my $mw = MainWindow->new;

my $c = $mw->Scrolled(
        qw/Canvas -width 400 -height 400 -relief sunken
        -bg white -borderwidth 1 -scrollbars se -scrollregion/ => 
                [qw/0 0 1000 1000/])->pack;
                
$mw->bind($mw, '<MouseWheel>', 
        [sub { my $unit = $_[1] > 0 ? -1 : 1; $c->yviewScroll($unit => 'units'); }, Ev('D')]
);

MainLoop;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2007-09-13 01:53
#99396 #99396
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Gibt es diese Probleme eigentlich nur mit dem Canvas-Widget? Oder gehen andere Widgets wie z.B. Listbox?
Spieler
 2007-10-01 02:57
#100167 #100167
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Hallo,
Das Thema ist ja eigentlich durch, aber trotzdem:
Das Problem scheint mir eher am focus zu liegen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 use warnings;
use strict;

use Tk;

my $mw = MainWindow->new;
my $e = $mw->Entry ->pack;
my $c = $mw->Scrolled(
qw/Canvas
-width 400 -height 400 -relief sunken
-bg white -borderwidth 1 -scrollbars se -scrollregion/ =>
[qw/0 0 1000 1000/])->pack;

my $ic = $c->Subwidget('scrolled');
$mw->MouseWheelBind($ic);
$ic->Tk::bind('<1>',[$ic,'Tk::focus']);

MainLoop;


Funktioniert bei mir und scheint mir sinnvoller, insbesondere wenn man noch andere 'Scrolled' widgets in der Applikation hat.

Christoph
ptk
 2007-10-01 22:40
#100193 #100193
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Hmm, bei X11 wird einfach das Widget gescrollt, über dem sich die Maus befindet. Aber bei X11 ist ja im Gegensatz zu Windows auch FocusFollowsMouse üblich.

Ein Skript zum Testen:
Code: (dl )
1
2
3
4
5
use Tk;
$top = new MainWindow;
$top->Scrolled("Listbox")->pack->insert("end", keys %ENV);
$top->Scrolled("Listbox")->pack->insert("end", keys %INC);
MainLoop;

Spieler
 2007-10-02 00:35
#100196 #100196
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Die Listbox, die den focus hat, scrollt, die andere nicht. Den Fokus bekommen sie nur mit Hilfe der 'Tab' Taste, nicht jedoch durch die Maus.

Canvas braucht einen extra call von MouseWheelBind, sonst scrollt er nicht.
Das Focus - binding oben habe ich ergänzt, da man den Canvas sonst mit der Maus nicht aktivieren kann.


Code: (dl )
   $ic->Tk::bind('<1>',[$ic,'Tk::focus']);


Den Aufruf von MouseWheelBind mit der Instanz würde ich dem schon genannten
Code: (dl )
1
2
3
14: $mw->bind($mw, '<MouseWheel>', 
15: [sub { my $unit = $_[1] > 0 ? -1 : 1; $c->yviewScroll($unit => 'units'); }, Ev('D')]
16: );

vorziehen, da diese Variante nicht nur auf das focus besitzende Widget wirkt, sondern immer zusätzlich auch auf das explizit im callback referenzierte.

Grüße,
Spieler
 2007-10-02 00:43
#100197 #100197
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Nochmal zur Verdeutlichung:
Hier scrollt der Canvas immer mit:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Tk;
my $top = new MainWindow;
$top->Scrolled("Listbox")->pack->insert("end", keys %ENV);
$top->Scrolled("Listbox")->pack->insert("end", keys %INC);
my $c = $top->Scrolled( qw/Canvas
-width 400 -height 400 -relief sunken
-bg white -borderwidth 1 -scrollbars se -scrollregion/ =>
[qw/0 0 1000 1000/])->pack;
$top->bind($top, '<MouseWheel>',
[sub { my $unit = $_[1] > 0 ? -1 : 1;
$c->yviewScroll($unit => 'units')
},
Ev('D')]
);
MainLoop;
Hier scrollt er nur wenn er den focus hat:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use Tk;
my $top = new MainWindow;
$top->Scrolled("Listbox")->pack->insert("end", keys %ENV);
$top->Scrolled("Listbox")->pack->insert("end", keys %INC);
my $c = $top->Scrolled( qw/Canvas
-width 400 -height 400 -relief sunken
-bg white -borderwidth 1 -scrollbars se -scrollregion/ =>
[qw/0 0 1000 1000/])->pack;
my $ic = $c->Subwidget('scrolled');
$top->MouseWheelBind($ic);
MainLoop;
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2007-09-07 14:23.