代码之家  ›  专栏  ›  技术社区  ›  Dan

仅当鼠标悬停时滚动

  •  3
  • Dan  · 技术社区  · 6 年前

    我想实现的是,当鼠标位于诸如 Scrolled 包含 ListBox ,用户应该能够使用鼠标滚轮上下滚动。如果鼠标在小部件上,则将其视为在小部件上 小部件侧面的滚动条。换句话说,如果鼠标在 不仅仅是 列表框 .

    我在下面提供了一个例子,当鼠标放在 但如果它只是在外面,它就不起作用 列表框 滚动

    值得一提的是,对于鼠标滚轮的支持,这是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 回复  |  直到 6 年前
        1
  •  1
  •   Dan    6 年前

    作为一个临时解决方案,我可以将它放在只存储一个组件的包装器对象中。这使我能够绑定到 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;