Прокрутка только при наведении мыши - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь обеспечить поведение прокрутки в графическом интерфейсе, разработанном с использованием Perl TK.

Чего я хотел бы добиться, это когда мышь находится над виджетом, таким как Scrolled, содержащим ListBoxпользователь должен иметь возможность прокручивать вверх и вниз с помощью колесика мыши.Мышь считается над виджетом, если она находится над самим виджетом или полос прокрутки по бокам виджета.Другими словами, если мышь находится где-нибудь над Scrolled, а не только над ListBox.

, я включил приведенный ниже пример, который работает, когда мышь находится над ListBox, но не работает.если он находится за пределами ListBox, но все еще находится на Scrolled.

Стоит отметить, что для поддержки колеса мыши это характерно для Windows в моем примере.

Пример сценария

#!/usr/bin/perl

use strict;
use warnings;
use Tk;

my $mainWindow = new MainWindow;

my $lb = $mainWindow->Scrolled("Listbox", -scrollbars => "osoe")->pack;

$lb->insert('end', qw/red blue yellow green orange/);
$lb->insert('end', qw/red blue yellow green orange/);
$lb->insert('end', qw/red blue yellow green orange/);
$lb->insert('end', qw/red blue yellow green orange/);
$lb->insert('end', qw/red blue yellow green orange/);

my $lbCanScroll = 0;
$mainWindow->bind('<MouseWheel>' => [sub{ if($lbCanScroll) { $lb->yview('scroll', -($_[1] / 120) * 3, 'units'); } }, Ev('D')]);
$lb->bind('<Leave>' => sub{$lbCanScroll = 0});
$lb->bind('<Enter>' => sub{$lbCanScroll = 1});

MainLoop;

Несмотря на то, что я опубликовал то, что я назову временным решением, было бы неплохо узнать, существует ли более многократно используемый способ для достижения этой цели.

1 Ответ

0 голосов
/ 27 сентября 2018

В качестве временного решения я могу поместить его в объект-оболочку, который хранит только этот один компонент.Это позволяет мне связываться с событиями Enter и Leave на этом объекте.Это выглядит как

#!/usr/bin/perl

use strict;
use warnings;
use Tk;

my $mainWindow = new MainWindow;

my $lbHolder = $mainWindow->Pane()->pack;

my $lb = $lbHolder->Scrolled("Listbox", -scrollbars => "osoe")->pack;

$lb->insert('end', qw/red blue yellow green orange/);
$lb->insert('end', qw/red blue yellow green orange/);
$lb->insert('end', qw/red blue yellow green orange/);
$lb->insert('end', qw/red blue yellow green orange/);
$lb->insert('end', qw/red blue yellow green orange/);

my $lbCanScroll = 0;
$mainWindow->bind('<MouseWheel>' => [sub{ if($lbCanScroll) { $lb->yview('scroll', -($_[1] / 120) * 3, 'units'); } }, Ev('D')]);
$lbHolder->bind('<Leave>' => sub{$lbCanScroll = 0});
$lbHolder->bind('<Enter>' => sub{$lbCanScroll = 1});

MainLoop;
...