Как отключить кнопку закрытия окна Perl / Tk ('X') в Windows - PullRequest
2 голосов
/ 03 февраля 2009

Есть ли способ отключить кнопку закрытия ('X') окна Perl / Tk? Я знаю, как игнорировать щелчок по нему, используя методику, описанную здесь , но я бы предпочел отключить его.

Я использую Perl / Tk в Windows.

Спасибо
splintor

Ответы [ 4 ]

2 голосов
/ 30 июня 2011

У меня есть приложение, которое я написал, меня интересовало то же самое, и я не отключаю его, но у меня есть обратный вызов подпрограммы, которая просто делает return;

$Mw->protocol('WM_DELETE_WINDOW',sub{return;});
2 голосов
/ 03 февраля 2009

Если вы находитесь в среде Unix, вам не повезло. Кнопкой «Закрыть» управляет Window Manager рабочего стола, что является совершенно другим процессом, который вы не можете контролировать.

Даже если взломать вы отключите кнопку «закрыть», пользователь всегда может вернуть его если оконный менеджер разрешает это. Например, менеджер окон просветления может включить / отключить все кнопки окна по требованию.

Техника, которую вы даете по ссылке, делает именно это. Не удаляет кнопка «закрыть». Он просто дает подсказку оконному менеджеру (WM_DELETE_WINDOW). Менеджер окон должен решать, будет ли этот совет учтён или нет.

См. Также страницы icccm и NetWM .

То, что вы хотите возможно возможно в Windows, но мой опыт работы с этой ОС ограничено, так что, возможно, другой постер узнает об этом.

0 голосов
/ 09 ноября 2017

Если вам не удастся действительно отключить кнопку закрытия (я имею в виду выделение серым цветом или даже удаление ее из оформления окна), то это может быть наиболее интуитивно понятным, чтобы вместо этого иконизировать ваше окно закрыть его. Это то, что я сделал.

$window->protocol('WM_DELETE_WINDOW', sub { $window->iconify(); } );

0 голосов
/ 23 июня 2016

Согласно Монахам Perl , похоже, что в Windows работает следующее:

#!/usr/bin/perl
use warnings;
use strict;
use Tk;

my $window = new MainWindow;
$window ->title("Close test");
$window ->geometry("400x250");

#prevents window from closing
$window->protocol('WM_DELETE_WINDOW' => sub {
                       print "Do stuff before exiting\n";
                       exit;
                   });

MainLoop;

В приведенном выше коде вы перехватываете сигнал, отправляемый, когда пользователь нажимает «X», и затем можете написать свою собственную подпрограмму для выполнения при нажатии кнопки.

Если вы хотите отключить значок закрытия , установите sub на пустое значение (фактически говоря, что "ничего не делать при нажатии"): 'WM_DELETE_WINDOW' => sub {}

...