Perl Tk: динамическое обновление Canvas - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь оживить результаты математического процесса в 2D-холсте с помощью Tk.Я решил сделать это с Tk, а не с SDL, потому что сейчас я работаю как с машинами Linux, так и с Windows, и Strawberry Perl не компилирует в Windows, а Tk работает на обоих компьютерах.

То, что я хотел бы сделать с Tk, это:

1) Отображение холста, в то время как моя программа определяет координаты точек, которые я хотел бы нарисовать.

2) Рисование ихмгновенно в холст, не дожидаясь окончания процесса

На самом деле это простая анимация, где группа точек перемещается по холсту, а мой скрипт обновляет их координаты.

Здесь у вас естьфрагмент кода, который я до сих пор писал для одной точки:

use Tk;

#calcuate the coordinate of a single point
$x=10;
$y=10;
$top = MainWindow->new();

# create a canvas widget
$canvas = $top->Canvas(width => 600, height => 400) -> pack();

# For example, let's create 1 point inside the canvas
$canvas->create ('oval', $x, $y, $x+3, $y+3, -fill=>"black");  # fill color of object

MainLoop;

Проблема с приведенным выше кодом состоит в том, что я хотел бы добавить в него свой «математический» скрипт для обновления $Координаты x и $ y выше (с некоторым циклом for / while) без выключения исходного холста путем получения единой точки, движущейся вокруг него (на самом деле их большеточки, которые я должен показать, но это мелочь).К вашему сведению, использование простой для цикла встраивания директивы 'Mainloop' 'не решает проблему.

Заранее спасибо, ребята

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

РЕШЕНИЕ:

В соответствии с предложенным Стефаном Беккером вариантом №2, вот что окончательно решило проблему:

use Tk:

$top = MainWindow->new();

# create a canvas widget
$canvas = $top->Canvas(width => 600, 
                        height => 400,
                        background => 'black') -> pack();

$x=300; 
$y=200; 

my $update = sub {
    $canvas->delete('all'); #unquote this line if you don't want the original point positions to be drawn in the canvas. Viceversa
    $x=$x+(-5+rand(10)); #white noise
    $y=$y-(-5+rand(10)); #white noise
    $canvas->create ('oval', $x , $y , $x+5, $y+5, -fill=>"red"); 
    };  

    $top->repeat(50, $update); 

MainLoop;

Я только что добавил выражение $ canvas->удалить ('all') в начале цикла обновления, чтобы нарисовать только реальные точки, а не историю.

0 голосов
/ 07 февраля 2019

Цитирование из Мастеринг Perl / Tk , глава 15 «Анатомия основного цикла»:

Вариант 1: использовать собственную реализацию MainLoop

use Tk qw(:eventtypes);

while (Tk::MainWindow->Count) {
    # process events - but don't block waiting for them
    DoOneEvent(ALL_EVENTS | DONT_WAIT);

    # your update implementation goes here
}

Вариант 2: использовать повторяющееся событие таймера

Позже в этой главе говорится, что DoOneEvent() на самом деле не является необходимым для большинства вещей.Вместо этого вы можете использовать события таймера, например

my $update = sub {
    # your update implementation goes here
};

# run update every 50ms
$top->repeat(50, $update);

MainLoop;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...