Как вы перемещаете главное окно под Perl Tkx? - PullRequest
1 голос
/ 31 июля 2009

Более или менее преобразовав множество старых сценариев Tk в Tkx, я застрял в порте для следующей функции, которая перемещает окно, переданное в качестве параметра, в центр экрана. Я обычно вызывал это непосредственно перед вызовом MainLoop, после чего Tk, очевидно, определился со значениями reqwidth и reqheight.

sub CenterWindow
{
    # Args: (0) window to center
    # (1) [optional] desired width
    # (2) [optional] desired height

    my($window, $width, $height) = @_;

    $window->idletasks;
    $width = $window->reqwidth unless $width;
    $height = $window->reqheight unless $height;

    my $x = int(($window->screenwidth / 2) - ($width / 2));
    my $y = int(($window->screenheight / 2) - ($height / 2));

    $window->geometry($width . "x" . $height . "+" . $x . "+" . $y);
}

idletasks можно изменить на Tkx :: update () при необходимости, но я затрудняюсь найти какой-либо очевидный перевод для оконных частей этой старой подпрограммы Tk. Похоже, что Tkx не имеет эквивалента для reqwidth, reqheight, screenwidth илиheightheight, которые можно получить с помощью cget ().

Имеет ли значение тот факт, что я сейчас использую макет сетки в Tkx, а не макет пакета в Tk?

Кстати, я запускаю ActivePerl 5.10 в Windows Vista, если это имеет какое-то значение.

1 Ответ

1 голос
/ 07 августа 2009

Менеджер геометрии не имеет значения; это только управляет тем, как виджеты расположены внутри фрейма. Полученные вами данные доступны с помощью команды winfo:

sub CenterWindow {
    # Args: (0) window to center
    # (1) [optional] desired width
    # (2) [optional] desired height

    my ($window, $width, $height) = @_;

    Tkx::update('idletasks');
    $width  ||= Tkx::winfo('reqwidth',  $window);
    $height ||= Tkx::winfo('reqheight', $window);

    my $x = int((Tkx::winfo('screenwidth',  $window) / 2) - ($width / 2));
    my $y = int((Tkx::winfo('screenheight', $window) / 2) - ($height / 2));

    $window->g_wm_geometry($width . "x" . $height . "+" . $x . "+" . $y);
}

Насколько я могу судить, вы должны вызывать winfo напрямую, вы не можете использовать синтаксис OO.

Вы, наверное, уже поняли это, но при разработке с Tkx вам нужно обратиться к документации Tcl Tk . Документация Tkx просто описывает, как работает (очень тонкий) слой перевода. Кроме того, группа usenet comp.lang.perl.tk (или список рассылки ptk мост к нему), вероятно, является лучшим ресурсом для вопросов Tkx, поскольку как минимум один из ребят из ActiveState за Tkx можно найти там.

...