【问题标题】:Scroll only when mouse over仅在鼠标悬停时滚动
【发布时间】:2019-03-03 08:51:17
【问题描述】:

我正在尝试在使用 Perl TK 开发的 GUI 上提供滚动行为。

我想要实现的是,当鼠标悬停在包含ListBoxScrolled 之类的小部件上时,用户应该能够使用鼠标滚轮上下滚动。如果鼠标位于小部件本身小部件两侧的滚动条上方,则鼠标计为在小部件上方。换句话说,如果鼠标在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;

虽然我已经发布了我称之为临时解决方案的内容,但很高兴知道是否有更可重用的方法来实现这一目标。

【问题讨论】:

  • 有趣的是,在 unix (ubuntu 18.04) 上,您可以在保持滚动行为的同时注释掉 $mainWindow-&gt;bind('&lt;MouseWheel&gt;' =&gt; [sub{ if($lbCanScroll) { $lb-&gt;yview('scroll', -($_[1] / 120) * 3, 'units'); } }, Ev('D')]); 部分,所以它必须是另一个绑定。
  • @saudic 感谢您的回复。这很奇怪,因为上面的代码实际上就是整个程序。我可能正在使用一个非常旧的 Perl TK 版本,它可能不支持这种行为(不是我的选择,或者我会更新它),或者它在 Windows 和 Linux 上的行为可能不同。不管怎样,谢谢你的信息

标签: windows perl tk perltk


【解决方案1】:

作为一种临时解决方案,我可以将它放在一个仅存储一个组件的包装对象中。这允许我绑定到该对象上的EnterLeave 事件。有点像

#!/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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多