我有一个 Perl/Tk 窗口,它显示在所有其他窗口的顶部。 它是一个主窗口->框架->带有文本的标签(它是一个安全分类横幅)。 它一定是一个位于顶部的窗口。 但是,现在用户无法将窗口从其设置位置移动,因此它偶尔会覆盖较低的窗口控件。
如何使该窗口可移动以便重新定位?
由于我位于封闭网络中,因此无法轻松访问外部模块,因此简单的 Perl/Tk 代码是最好的。
这是运行 KDE 或 Gnome 桌面的 Linux 系统。
我发现如果你从 Perl/TK 主窗口中删除装饰,它就无法响应鼠标移动。
我知道这已经晚了三年,但是......在 O'Reilly 的书“Mastering Perl/Tk”的第 15.7 节中,该书讨论了在没有窗口管理器装饰的情况下设置启动屏幕(特别是使用 OverrideRedirect 功能),以下内容出现。
首先,在构造过程中,Splashscreen 小部件绑定鼠标按钮 3 按下并释放,如下所示:
$self->bind('<ButtonPress-3>' => [$self => 'b3prs', Ev('x'), Ev('y')]);
$self->bind('<ButtonRelease-3>' => [$self => 'b3rls', Ev('X'), Ev('Y')]);
然后两个b3___()函数的定义如下:
sub b3prs {
my ($self, $x, $y) = @_;
$self->{ofx} = $x;
$self->{ofy} = $y;
} # end b3prs
sub b3rls {
my($self, $X, $Y) = @_;
$X -= $self->{ofx};
$Y -= $self->{ofy};
$self->geometry("+${X}+${Y}");
} # end b3rls
现在,我承认,所有这些都脱离了上下文,但重要的是,在某些时候必须执行某种事件循环,以便接收、处理和分派按钮事件,并允许回调运行并从而重新定位启动屏幕(在本例中),即您当前不可移动的窗口 - 作为响应。 事件循环可以是对 Tk::MainLoop() 的通常程序结束调用,也可以是对埋藏在您自己的持续循环中的 Tk::DoOneEvent() 的重复调用,具体取决于行为需求和总体情况你的程序的架构。 (您可能必须在 DoOneEvent() 之后调用顶级小部件的 update() 方法——否则我可能是错的,而您不会。)