无装饰的 Perl/TK 窗口用鼠标移动

问题描述 投票:0回答:2

我有一个 Perl/Tk 窗口,它显示在所有其他窗口的顶部。 它是一个主窗口->框架->带有文本的标签(它是一个安全分类横幅)。 它一定是一个位于顶部的窗口。 但是,现在用户无法将窗口从其设置位置移动,因此它偶尔会覆盖较低的窗口控件。

如何使该窗口可移动以便重新定位?

由于我位于封闭网络中,因此无法轻松访问外部模块,因此简单的 Perl/Tk 代码是最好的。

这是运行 KDE 或 Gnome 桌面的 Linux 系统。

perl tk-toolkit
2个回答
0
投票

我发现如果你从 Perl/TK 主窗口中删除装饰,它就无法响应鼠标移动。


0
投票

我知道这已经晚了三年,但是......在 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() 方法——否则我可能是错的,而您不会。)

© www.soinside.com 2019 - 2024. All rights reserved.