Back to site

Perl і Tk пашырэнне

Выкарыстаньне X з Perl

Стыў Lidie

Ну, прывітаньне! Гэта першы з некалькіх артыкулаў па інструментара Tk, цудоўныя аб'ектна-арыентаванага пашырэння Perl, што забяспечвае поўную калекцыю віджэт для ўсіх відаў элегантны графічных прыкладанняў. Tk быў распрацаваны Джонам К. Ousterhout і адаптаваныя і падоўжаны на Perl Нік Ing-Simmons.

Пашырэння Tk для Perl называецца Perl / Tk, і працуе пад X Window System можна знайсці на большасці кампутараў Unix. X выкарыстоўвае мадэль кліент / сервер, дзе кліенты (такія, як той, які вы зараз ўбачыце) забяспечваюць сувязь з серверам, які кіруе кампутар-дысплей, клавіятура і мыш. Для кожнага адлюстравання ёсць аконны мэнэджар, які забяспечвае паслядоўнае "знешні выгляд", па меншай меры на высокім узроўні, для ўсіх кліентаў абмену машыны дысплей. Ёсць шмат розных аконных мэнэджараў, але яны ўсё забяспечваюць аналагічных аб'ектаў, такіх як iconifying, перамяшчэнне, змяненне памераў акна, і выкарыстоўваючы іх у дэкаратыўныя рамкі. Вы ўбачыце акно мэнэджара каманды ў наступных калонках.

Дадзеная артыкул утрымлівае далікатнае ўвядзенне ў асновы Perl / Tk, пасля чаго яна развіваецца, крок за крокам, рэальнага ўжывання. Як тыповы мой стыль лісты я часта спараджаюць больш пытанняў, чым я адказваю, так што вы хочаце захаваць гэты URL ўручную:

http://w4.lns.cornell.edu/~pvhp/ptk/ptkFAQ.html Гэта размяшчэнне Perl / Tk FAQ, сховішчы амаль усё, калі-небудзь напісаных пра Perl / Tk, задуменна падтрымліваецца Пётр Prymmer.

Бягучая версія Perl / Tk з'яўляецца Tk800.012 і паспяхова збіраецца на Perl 5.004_04 або 5,005. Каб атрымаць апошнюю Tk размеркавання спасылка на сайт CPAN побач з вамі, наведаўшы http://www.perl.com.

Perl / Tk праграмы напісаны з выкарыстаннем аб'ектна-арыентаванага сінтаксісу $ аб'ектна-> метад, дзе $ аб'ект адносіцца да віджэтаў Tk, магчыма Батт або меню, і імёны метадаў дзеянні павінны быць выкананы. Мы даведаемся больш пра аб'ектах і такіх у наступнай калонцы, але цяпер, без далейшых цырымоній, вось ваш прататып "прывітанне свет" праграма, напісаная на Perl / Tk, наводмаш ад размеркавання Tk:

#!/usr/local/bin/perl -w
#
# Просты Tk скрыпт для стварэння кнопкі, якая друкуе "Hello, World". Націсніце на
# Кнопку, каб завяршыць праграму.
#
# Першы радок ніжэй імпарту Tk аб'ектаў у дадатку,
# Другая радок стварае галоўнае акно, трэцяга па пяты лініі ствараюць
# Кнопка і вызначыць код для выканання, калі націснутая кнопка,
# Шосты радку пытае ўпакоўшчык ў парніковай плёнкі галоўнае акно прыкладання
# Вакол кнопкі, і сёмая радок пачынаецца цыкл апрацоўкі падзей.
 
use Tk;
$MW = MainWindow->new;
$hello = $MW->Button(
    -text    => 'Hello, world',
    -command => sub {print STDOUT "Hello, world\n"; exit;} );
$hello->pack;
MainLoop;
Калі праграма выконваецца, гэта акно:

 

 

Праграма можа ці не можа быць само за сябе! Галоўнае акно, $ МВт, з'яўляецца першым верхняга ўзроўню акна праграмы - першаснай "кантэйнер" для большасці, калі не ўсё, нашчадак віджэты, якія ўтвараюць іерархію (кожны віджэт заўсёды мае бацькі, і можа мець дзяцей, а).

Гэта асабліва верхняга ўзроўню Віджэт аднаго дзіцяці аб'ект, які належыць да класа Button. Усе віджэты аб'ектах, вытворным ад базавага класа, успадкоўваючы яго характарыстыкі. Вы можаце мець некалькі асобнікаў кнопку аб'ектаў, якія выглядаюць зусім розныя, але доля адметных характарыстык класа кнопкі: яны адлюстроўваюць тэкст надпісы або растравае малюнак, і "што-то зрабіць", калі абраны. Пры націску на кнопку ў прыкладзе націснутая ананімных падпраграм ажыццяўляецца якая друкуе "Hello, World" і завяршае працу. Падпраграма называецца, паколькі ён звязаны з націскам кнопкі. Амаль усе класы віджэтаў ёсць кнопка па змоўчванні і націску клавішы прывязкі устаноўленых Perl / Tk, і вы можаце дадаваць, выдаляць або змяняць прывязкі на класе або за аснову віджэту па сваім меркаванні.

The statement:

$hello = $MW->Button(... ); з'яўляецца віджэт каманду стварэння: аб'ект класа кнопкі пабудавана і настроена з зададзенымі параметрамі, які становіцца нашчадкам віджэту $ МВт, у галоўным акне. Пераменная $ прывітанне ініцыялізуецца аб'ект спасылку на зноў створаную кнопку віджэту. У Perl спасылка на аб'ект проста звычайную спасылку, якая паказвае на "нешта", што было "дабраславіў" (з выкарыстаннем Perl дабраславіць () функцыі) у адным класе. "Нешта" з'яўляецца хэш або спіс, і акт блаславення аб'екта сувязі ён таму ці іншаму класу. Perl / Tk аб'ектаў віджэту хэшаў, як паказана ў гэтым адладкі выканайце каманду: Dandy:/home/bug/perl/tpj1/perl -de 0

Загрузка БД падпраграм з perl5db.pl версіі 01/02
Emacs падтрымкі.

Enter h or `h h' for help.

main::(-e:1):   0

DB<1> use Tk
DB<2> $ref = {}
DB<3> $MW = MainWindow->new
DB<4> $oref = $MW->Button
DB<5> p $ref
HASH(0x200f78c8)
DB<6> p $oref
Tk::Button=HASH(0x2021c780)

Пераменная $ реф з'яўляецца просты спасылкай на ананімную хэш, у той час як $ OREF з'яўляецца аб'ектам спасылкай на хэш-класа Tk:: Button. Але цяпер, я буду спасылацца на зменныя, такія як $ прывітанне і $ OREF проста як аб'екты або віджэты. (Калі вы не знаёмыя з адладчык Perl, мова Perl-дэ-0 пачынаецца інтэрактыўнае асобнік Perl, дзе вы можаце адладжваць, або проста ўвядзіце Perl каманды - вялікае прататыпаў. Асяроддзем)

Заяву:

$hello->pack; з'яўляецца выклікам каманды метад: геаметрыя менеджэр Tk вядомы як ўпакоўшчык выклікаецца прызначыць памер і становішча на $ прывітанне аб'ект, а затым на "карту" яго. Віджэт павінен быць адлюстраваны (або зразумеў), перш чым яна становіцца бачнай на экране. Па змаўчанні віджэтаў заўсёды спакаваныя ў іх бацькі, і калі вы не ўказалі іншае ўпакоўшчык выраўноўвае іх у слупок, зверху ўніз.

Perl / Tk праграмы кіруюцца падзеямі, гэта азначае, што вы не пішаце "асноўны цыкл" ў звычайным сэнсе, а хутчэй дэлегаваць гэтую працу да ТЗ. Замест гэтага, вы пішаце невялікіх участкаў кода, званыя зваротныя выклікі, мудрагелістае назва для падпраграмы, для апрацоўкі гэтых падзей і Tk выклікае па меры неабходнасці. Ёсць шмат падзей ТЗ, якія павінны быць апрацаваны своечасова: таймеры, файлавы ўвод / выснова, і рух і кнопкі падзеі, генераваных мышшу. Вы актываваць цыкл падзей Tk з MainLoop () заяву, якое павінна быць апошняй радку выклікаецца вашай праграмы.

Такім чынам, найбольш Perl / Tk прыкладанняў доля гэтых агульных рыс:

Tk забяспечвае 15 стандартных віджэтаў, Perl / Tk забяспечвае дадатковую кампазітных віджэтаў, такіх як ColorEditor, Dial, FileSelect, LabEntry і ў табліцы. Кампазітны віджэтаў, званыя таксама megawidgets, складаныя аб'екты, пабудаваныя з гэтых стандартных віджэтаў. Perl / Tk прыкладанні, якія я збіраюся развіваць называецца ўчастак праграмы, або пляснуць на кароткі, паказваючы кнопкі, Палатно, Дыялог, рамкі, этыкеткі, LabEntry, меню, Menubutton, прагорткі і тэкставыя віджэты. Plop участкаў спіс матэматычных функцый віду $ Y = F ($ X), дзе $ X ітэрацыя ад графа X-мінімум для X-максімум. Кожная функцыя ацэньваецца ў сваю чаргу, для пэўнага значэння $ X, Y значэнне вылічаецца, а затым пункту намаляваны на палатне. (Plop падкрэслівае Віджэт палатна, таму што я заўважыў, што новыя карыстальнікі Tk, пасля прагляду каля 2000 ліній палатно дакументацыі праязджаць міма, як правіла, месца "вывучае Віджэт палатна" у канцы свайго спісу спраў, я думаю, што вы " ўбачыце, што шматфункцыянальныя не азначае, складаныя ў выкарыстанні.)

Улічваючы, што палатно віджэт можна разглядаць як палатно мастака для свабоднай рукой нанясення графікі і тэксту, мы будзем звяртацца з ёй як класічнай дэкартавай сістэме каардынат. Ключавым адрозненнем з'яўляецца тое, што палатно паходжання, каардынаваць пазіцыі (0,0), вызначаецца як верхнім левым куце палатна вокны, і што палатно X каардынаты павелічэнне пры пераходзе права (як і варта было чакаць) і Y каардынаты Павелічэнне пры руху ўніз (так жа, як няма). Акрамя таго, палатно каардынат не можа мець адмоўныя значэння. Па гэтых прычынах, мы будзем выкарыстоўваць ўраўненні для пераўтварэння паміж палатном і дэкартавай каардынаты.

Вось самая першая версія праграмы:

    #!/usr/local/bin/perl -w
    use strict;
    use Tk;
    my($o, $s) = (250, 20);
    my($pi, $x, $y) = (3.1415926, 0);
    my $mw = MainWindow->new;
    my $c = $mw->Canvas(-width => 500, -height => 500);
    $c->pack;
    $c->createLine(50, 250, 450, 250);
    $c->createText(10, 250, -fill => 'blue', -text => 'X');
    $c->createLine(250, 50, 250, 450);
    $c->createText(250, 10, -fill => 'blue', -text => 'Y');

    for ($x = -(3*$pi); $x <= +(3*$pi); $x += 0.1) {
        $y = sin($x);
        $c->createText( $x*$s+$o, $y*$s+$o, -fill => 'red', -text => '.');
        $y = cos($x);
        $c->createText( $x*$s+$o, $y*$s+$o, -fill => 'green', -text => '.');
    }

    MainLoop;

Вядома, гэта вельмі пачварнае код, не маючы ў стылі, але гэта "доказ канцэпцыі". Як вы ўбачыце, я буду пугай гэты код у належнай форме Pronto! Перш чым я растлумачу, вось як ён выглядае пры выкананні:
     

Некаторыя глабальныя зменныя ініцыялізуюцца, галоўнае акно, $ МВт, і Віджэт палатна, $ C, ствараюцца і палатно рэалізуецца. Наступныя чатыры заявы стварыць два палатна пазіцый (для графа восяў) і два элемента тэксту (для восяў этыкеткі). Іншыя тыпы элементаў палатно дугі, кропкавы малюнак, малюнак, авал, шматкутнік, прастакутнік і вокны.

Заявы:  

    $c->createLine(50, 250, 450, 250);
    $c->createText(10, 250, -fill => 'blue', -text => 'X');
     
маляваць і каментаваць восі х. Метад CreateType палатно стварае палатно пункт тыпу Тып: тут я ствараю адзін пункт лініі і адно тэкставае пункта. Так як палатно 500x500 пікселяў я свядома арганізаваў палатно каардынат пазіцый (250250) супадаюць з дэкартавымі паходжання (0,0). Я таксама хацеў, каб 50-пікселяў уверх / ўніз і налева / направа поля. З улікам гэтых контрсилами лініі восі Х пачынаецца (50250) і распаўсюджваецца гарызантальна (450.250), з сіняй літарай "X" пэндзля ў левым полі на (10 250). Аналагічным чынам, вось Y з'яўляецца пагладзіў вертыкальна зверху ўніз і пазначаныя сінім "Y". Цяпер усё, што засталося на самай справе граф некаторыя функцыі.

Для пастаноўкі вагаецца ад -3 З да + 3 P радыянах, і нават старыя біялогіі-тыпу, як я ведаю, што сінус () і косінус () вяртае значэнне ў дыяпазоне [-1,1]. Такія малюсенькія значэння не асабліва карысна, калі вы шукаеце графа ў адзін кропак, таму пераўтварэнне неабходна:

    $y = sin($x);
    $c->createText($x*$s+$o, $y*$s+$o, -fill => 'red', -text => '.');
     
Мы хочам, каб наш маштаб $ Y значэння, што і выраз $ Y * $ S + $ O робіць: значэнне Y павялічваецца ў 20 разоў і перакладзеная на палатно паходжання. Тады чырвоная кропка, нанесенай на палатно. (Там на самай справе памылка з'яўляецца раўнанне пераўтварэння; Вы можаце вызначыць яго функцыі? Падказка, паспрабуйце графічны ехр ().)

Так ідзе справа з пачварным прататып шлёп, з вялікай колькасцю працы, якую я магу ўключыць гэты код у першакласных Perl / Tk дадатку. Для пачатку я хачу, каб ліквідаваць кожны цвёрда значэнне і выкарыстоўваць зменныя замест. Тады я дадам гэтыя асаблівасці:

Ніжэй вы ўбачыце прыклад выканання новага пляснуць. Поўная праграма даступная на вэб-сайце TPJ:

 

 
Галоўнае акно складаецца з трох асноўных рэгіёнаў, верхняя рамка з menubuttons (якія змяшчаюць файлаў і меню даведкі), палатно, сярэдняга (уключаючы назву і межавыя значэння), а ніжняя вобласць, якая змяшчае шэраг іншых віджэтаў (у тым ліку пракручваць тэкст віджэт са спісам функцый). Код Perl быў модульныя і выглядае прыкладна так:

    my $MW = MainWindow->new;
    initialize_dialogs;
    initialize_menus;
    initialize_canvas;
    initialize_functions;
Падпраграма initialize_dialogs () стварае дыялогавае віджэты, якія не з'яўляюцца часткай галоўнага акна належнага, але ўсплываючае ў пэўны час, пачакайце, пакуль карыстальнік ўмяшацца, а затым сысці. Як правіла, яны захоўваюцца на працягу жыццёвага цыкла прыкладання, такім чынам, яны ствараюцца адзін раз падчас ініцыялізацыі праграмы, а затым схаваныя іх зняцця пакуль не прыйшоў час, каб "паказаць" іх; Show () зьяўляецца дыялёг метад, які deiconifies віджэт, чакае, пакуль карыстальнік для выбару дыялогавага кнопку, а затым вяртае пазнаку абраную кнопку ў праграме. Вось як "S боўць" Аб "Дыялог віджэт створаны:
    $DIALOG_ABOUT = $MW->Dialog(
        -title   => 'About',
        -text    => "plot_program $VERSION\n\n 95/12/04",
        -bitmap  => 'info',
        -buttons => ['Dismiss']);
Як і ўсе каманды стварэння віджэтаў, $ MW-> Дыялог () вяртае спасылку на аб'ект. Кнопкі атрыбут спіс радкоў, якія specifiy Дыялог надпісы на кнопках. У гэтым выпадку, ёсць толькі адна кнопка, "Адхіліць", якая выходзіць дыялог пасля чытання сапраўды інфарматыўным "Аб" інфармацыі!

Каб стварыць пляснуць меню, initialize_menus () паўторна некаторыя старыя код, які генеруе menubuttons ад структуры дадзеных, у асноўным таму, што я лянівы і меню заўсёды патрабуецца час, каб атрымаць толькі права. У маім наступным артыкуле ідзе ў падрабязнасці па меню, каскады, і гэтак далей, але цяпер разгледзець гэты код:

    $MBF = $MW->Frame(-relief => 'raised', -borderwidth => 1);
    $MBF->pack(-fill => 'x');
    make_menubutton($MBF, 'File', 0, 'left', [ ['Quit', \&exit, 0]]);
    make_menubutton($MBF, 'Help', 0, 'right', [
        ['About', [$DIALOG_ABOUT => 'Show'], 0],
        ['',      undef,                     0],
        ['Usage', [$DIALOG_USAGE => 'Show'], 0]]);
Першы аператар стварае раме кантэйнера для захоўвання menubuttons, з рэльефам і падняў BorderWidth аднаго. Рэльефу атрыбут паказвае 3D выгляд віджэту, але вы павінны ненулявой BorderWidth яго бачыць. Звярніце ўвагу, што кадр быў запакаваныя яго запоўніць набор атрыбутаў на "х", што робіць геаметрыі менеджэр ўпакоўшчык пашырыць рамкі ў кірунку X, каб запоўніць усе наяўнае прастору. У адваротным выпадку, файл даведкі і menubuttons б быць супастаўленыя бок аб бок і ў цэнтры кадра. Стварэнне menubuttons і адпаведныя пункты меню цягне за сабой выклікі make_menubutton (), з гэтых 5 параметраў:   Зваротныя выклікі прыходзяць у розныя густы, і мы будзем бачыць больш з іх у наступныя слупкі, але па справе боўць "Ёсць толькі дзве: прамая спасылка на падпраграму (таксама званы код спасылкі), і спасылкі на масіў. Прыкладам першай формы з'яўляецца пункт меню Выхад, у якім утрымліваецца заклік выхаду (). Пункты меню "Даведка" выкарыстоўваць другую форму, дзе першы элемент масіву з'яўляецца аб'ект (віджэт спасылка), а другое назва выкліканага метаду. Такім чынам, калі карыстальнік выбірае "Аб" аб віджэт дыялогу з'яўляецца. Звярніце ўвагу, што віджэты выкарыстоўваюцца ў функцыі зваротнага выкліку павінна існаваць да іх называюць таксама - што менавіта таму дыялог віджэты былі створаны ў першую чаргу.

Падпраграма initialize_canvas () генеруе сярэдняй частцы пляснуць галоўнае акно, але крыху адрозніваецца ад прататыпа версіі, паколькі яна мае назву лініі, убудаваныя віджэты з рэдагуемы X і Y значэння, і сякеры пераехаў у межах вобласці, каб паменшыць Visual беспарадак.

    $CANV = $MW->Canvas(
        -width  => $MAX_PXL + $MARGIN * 2,
        -height => $MAX_PXL,
        -relief => 'sunken');
    $CANV->pack;
    $CANV->CanvasBind('<Button-1>' => \&display_coordinates);
     
Прыведзены вышэй код стварае палатна, але выкарыстоўвае глабальныя "канстант", а не жорстка значэння: $ MAX_PXL, відавочна, памер палатна, у піксэлях. Вось наша першая зваротнага выкліку каманды рэгістрацыі, якая звязвае падпраграмы display_coordinates () для кнопкі мышы 1.
    $CANV->createText( 325, 25,
        -text => 'Plot Continuous Functions Of The Form y=f($x)',
        -fill => 'blue');
Нічога новага няма, а? Але пачакайце, што нешта новае вынікае, тып элемента палатно называецца акно!
    # Стварэнне лініі ўяўляюць восі Х і назавіце яго. Тады этыкеткі
    # Мінімальных і максімальных значэнняў X і прыцягнуць дзяленняў, каб паказаць, дзе яны
    # Падзенне. Восі межы LabEntry віджэты убудаваных у Windows Canvas.

    $CANV->createLine(
        $MIN_PXL + $MARGIN, $MAX_PXL - $MARGIN,
        $MAX_PXL - $MARGIN, $MAX_PXL - $MARGIN);

    $CANV->createWindow(
        $MIN_PXL + $MARGIN, $MAX_PXL - $label_offset,
        -window => $MW->LabEntry(
            -textvariable => \$X_MIN,
            -label        => 'X Minimum'));

    $CANV->createLine(
        $MIN_PXL + $MARGIN, $MAX_PXL - $MARGIN - $tick_length,
        $MIN_PXL + $MARGIN, $MAX_PXL - $MARGIN + $tick_length);

    $CANV->createWindow(
        $MAX_PXL - $MARGIN, $MAX_PXL - $label_offset,
        -window => $MW->LabEntry(
            -textvariable => \$X_MAX,
            -label        => 'X Maximum'));

    $CANV->createLine(
        $MAX_PXL - $MARGIN, $MAX_PXL - $MARGIN - $tick_length,
        $MAX_PXL - $MARGIN, $MAX_PXL - $MARGIN + $tick_length);
     

Першым пунктам лініі палатно проста гарызантальнай восі X, а два астатніх ліній падзелу на кожным канцы. Два элемента акна кантэйнераў, дзе іншыя аб'екты могуць быць з начыннем, у гэтым выпадку два кампазітных віджэтаў LabEntry, які, як вы ўжо маглі здагадацца, аб'яднаць асаблівасці этыкеткі і ўступленне віджэтаў. Іх атрыбуты textvariable з'яўляюцца спасылкамі на скаляр $ X_MIN і $ X_MAX, калі змены ў праграме зменнай значэнне гэта адлюстроўваецца на дысплеі, і калі карыстальнік рэдагуе LabEntry звязаныя textvariable абнаўляецца. Восі Y апрацоўваецца аналагічным чынам.

Падпраграма initialize_functions () стварае боўць "S астатніх віджэтаў, якія, у топ-уніз ўпакоўкі парадку, Spacer рамкі, этыкеткі забеспячэння элементарнага інструкцыі, тэкставага поля з прыкладзеным прагорткі, і, нарэшце, яшчэ адзін кантэйнер рамкі трымаць кнопку або каля таго.

    $MW->Frame(-height => 20)->pack;
    $MW->Label(
        -text       => "Калі ласка, увядзіце тут функцыі,
        -foreground => 'blue')->pack;

    # Стварэнне рамкі з пракручваецца віджэт Тэкст, які адлюстроўвае функцыі
    # Спіс, і кнопка для пачатку ўчастак дзейнасці.

    my $functions_frame = $MW->Frame;
    $functions_frame->pack;
    $TEXT = $functions_frame->Scrolled(qw/Text -height 6 -scrollbars e/ );
    $TEXT->pack;
    update_functions;

    my $buttons_frame = $MW->Frame;
    $buttons_frame->pack(-padx => 10, -pady => 5, -expand => 1, -fill => 'x');
    my @pack_attributes = qw/-side left -fill x -expand 1/;
    $buttons_frame->Button(
        -text    => 'Plot',
        -command => \&plot_functions)->pack(@pack_attributes);
     

Але гул, 20 пікселяў высокая рамка (дзякуй за забароны на цвёрда канстанты!), Каб заняць месца і некаторыя тлумачальны тэкст падпісаны ў сіні колер. (Але ці ведаеце вы, што ўсюды, дзе можна даць памернасць, значэнне піксэлях цэлае Вы таксама можаце суфікс сімвалы я, C, M і P, каб паказаць, цалях, сантыметрах, міліметрах або кропкі?) Тады ёсць тэкставы віджэт з паласой пракруткі на якары "Усход", і, нарэшце, вялікі "Участак" кнопку. Звярніце ўвагу на зручнасць метаду пракруткі () для мацавання паласы пракруткі для тэкставага поля. Тэкставы віджэт утрымоўвае спіс функцый, што асабліва падыходзіць, паколькі кожная лінія можа быць пазначана і прызначаны іншы колер. Функцыя пункту затым прадстаўлены на гэты колер.

Графічны інтэрфейс ў цяперашні час завершана, і, калі карыстальнік выклікае "Участак" кнопку, зваротнага выкліку plot_functions () выконваецца. Перш чым на самай справе пабудовы функцыі пляснуць прыводзіць у парадак спіс да тэкставым акне і гарантуе, што кожная функцыя прысвойваецца свой ​​уласны колер. Plop прадугледжвае да дзевяці адначасовых функцый да цыклу кветак. Вось код:

    $TEXT->delete('0.0', 'end');
    my $i = 0;
    foreach (@FUNCTIONS) {
        $TEXT->insert('end', "$_\n", [$i]);
        $TEXT->tagConfigure($i,
            -foreground => $COLORS[$i % $NUM_COLORS],
            -font => '9x15');
        $i++;
    }
    $TEXT->yview('end');
     
Па-першае, усё будзе выдалены, ад лініі нуля, характар ​​нуля, да канца тэкставага поля. Тады кожная функцыя з масіва @ ФУНКЦЫІ ўстаўляецца і ўсталяваных тэг, які толькі, здараецца, яго парадкавы ў тэкставы віджэт. Тэг проста выяўленне радок, выкарыстоўваную для выкарыстання ў іншых камандах віджэту. У гэтым выпадку, адзначыў тэкставыя настроены з іх унікальным колерам пярэдняга плана і устаноўленых шрыфтоў фіксаванага прасторы.

Зараз, калі тэкст віджэт сінхронна з спісу функцый, давайце ўчастка некаторыя функцыі:

    $CANV->delete('plot');
    $canv_x  = $MIN_PXL + $MARGIN;  # X minimun
    $DX = $X_MAX - $X_MIN;          # update delta X
    $DY = $Y_MAX - $Y_MIN;          # update delta Y

    ALL_X_VALUES:
    for ($x = $X_MIN; $x <= $X_MAX; $x += ($X_MAX - $X_MIN) / $ALEN) {

        ALL_FUNCTIONS:
        foreach (0.. $#FUNCTIONS) {
            $y = eval $FUNCTIONS[$_];
            $canv_y = (($Y_MAX - $y) / $DY) * $ALEN + $MARGIN;
            $CANV->createText($canv_x, $canv_y,
               -fill => $COLORS[$_ % $NUM_COLORS],
               -tags => ['plot'],
               -text => '.') if $canv_y > $MIN_PXL + $MARGIN and $canv_y < $MAX_PXL - $MARGIN;
        } # forend ALL_FUNCTIONS
        $canv_x++; # next X pixel

    } # forend ALL_X_VALUES
     

Пасля ўсяго гэтага мы вярнуліся туды, дзе мы пачыналі, акрамя таго, што код быў дасягнуты больш агульнай і пераўтворым раўнанне была выпраўлена. X_MIN $ і $ X_MAX дынамічна прызначаныя таму, што яны з'яўляюцца часткай віджэты LabEntry, і прырашчэнне X дынамічна разлічваецца на аснове гэтых каштоўнасцяў і даўжыня восі. У пункту намаляваны на палатне, аўтаматычна прысвойваецца свой уласны колер. І кожная кропка з пазнакай радка "змову", так што ўсе бягучыя графікі могуць быць лёгка выдаленыя пры чарговым "змове" націснутая кнопка, вось што $ CANV-> Выдаліць ('ўчастак') заяву для.

Але ёсць адзін камень злева на камені: кнопка абавязковага створаны падчас стварэння палатна. Так як мы ўжо ведаем, як пераўтварыць дэкартавай каардынаты на палатне каардынат, я падумаў, было б цікава рабіць супрацьлеглае: пстрыкніце ў любым месцы на палатне для адлюстравання дэкартавай каардынат. Наступны код дэманструе, як звяртацца структуры X падзея, у гэтым выпадку націсніце кнопку:

    sub display_coordinates {
        my($canvas) = @_;
        my $e = $canvas->XEvent;
        my($canv_x, $canv_y) = ($e->x, $e->y);
        my($x, $y);
        $x = $X_MIN + $DX * (($canv_x - $MARGIN) / $ALEN);
        $y = $Y_MAX - $DY * (($canv_y - $MARGIN) / $ALEN);
        print "\n Canvas x = $canv_x, Canvas y = $canv_y.\n";
        print "Plot x = $x, Plot y = $y.\n";
    } # end display_coordinates
Калі абавязковага зваротнага выкліку выконваецца падпраграма няяўна перадаецца спасылка на яго віджэт - тут, палатно. Выкарыстаньне XEvent (), пераменная $ E зараз прысвойваецца спасылка на падзею структуры. Два з $ E 'S метады, X () і Y (), вяртанне адноснага палатно каардынатаў становішча мышы, калі кнопка 1 была націснутая. Як толькі каардынаты вядомыя гэта проста пытанне выкарыстання існуючых пераўтварэнні ўраўненні, рашэнні для X і Y, і друк вынікаў.

Вось менавіта за гэты час, калі ў вас ёсць пытанні па гэтым артыкуле, або ідэі для маючага адбыцца іх, не саромейцеся звяртацца да мяне. У наступны раз мы разгледзім больш у аб'екты, будаваць складаны віджэт і вывучыць меню больш падрабязна.


Стыў Lidie з'яўляецца сістэмным праграмістам ва універсітэце ліха.
Published (Last edited): Apr 8 , source: http://www.lehigh.edu/~sol0/ptk/tpj1.html