首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python CodeSkulptor从内部暂停绘制For循环

Python CodeSkulptor从内部暂停绘制For循环
EN

Stack Overflow用户
提问于 2020-01-17 21:19:04
回答 1查看 318关注 0票数 1

我想为搜索算法(BFS,A*等)构建一些可视化。在一个网格内。

我的解决方案应该使用CodeSkulptor simplegui (或使用SimpleGUICS2Pygame的离线版本)显示算法的每个步骤。

我已经制作了一个版本,通过改变颜色来突出显示所有被访问的单元格,但是我遇到了麻烦,试图让路径一步一步地显示,每一步之间都有一个时间延迟。

我已经提取了问题的本质,并用下面的代码创建了一个表示它的最小示例,也可以在这里在线运行:http://www.codeskulptor.org/#user47_jB2CYfNrH2_2.py

我想要的是在change_colors()函数期间,在每次迭代之间有一个延迟。CodeSkulptor没有可用的time.sleep(),我不认为它会有任何帮助。

CodeSkulptor确实有可用的计时器,这可能是一种解决方案,尽管我不知道如何在这种情况下使用它。

代码如下:

代码语言:javascript
复制
import time

try:
    import simplegui
except ImportError:
    import SimpleGUICS2Pygame.simpleguics2pygame as simplegui

    simplegui.Frame._hide_status = True

TITLE = "TEST"
FRAME_WIDTH = 400
FRAME_HEIGHT = 400
DELAY = 10


class Square:
    """This class represents a simple Square object."""

    def __init__(self, size, pos, pen_size=2, pen_color="red", fill_color="blue"):
        """Constructor - create an instance of Square."""
        self._size = size
        self._pos = pos
        self._pen_size = pen_size
        self._pen_color = pen_color
        self._fill_color = fill_color

    def set_color(self, color):
        self._fill_color = color

    def get_color(self):
        return self._fill_color

    def is_in(self, pos):
        """
        Determine whether coordinates are within the area of this Square.
        """
        return self._pos[0] < pos[0] < self._pos[0] + self._size and self._pos[1] < pos[1] < self._pos[1] + self._size

    def draw(self, canvas):
        """
        calls canvas.draw_image() to display self on canvas.
        """
        points = [(self._pos[0], self._pos[1]), (self._pos[0] + self._size, self._pos[1]),
                  (self._pos[0] + self._size, self._pos[1] + self._size), (self._pos[0], self._pos[1] + self._size)]
        canvas.draw_polygon(points, self._pen_size, self._pen_color, self._fill_color)

    def __str__(self):
        return "Square: {}".format(self._pos)


def draw(canvas):
    for square in squares:
        square.draw(canvas)


def change_colors():
    for square in squares:
        # time.sleep(1) # Not implemented in CodeSkulptor and would'nt work anyway
        square.set_color("green")


frame = simplegui.create_frame(TITLE, FRAME_WIDTH, FRAME_HEIGHT)
frame.set_draw_handler(draw)

width = 20
squares = []
for i in range(10):
    squares.append(Square(width, (i * width, 0)))

change_colors()

frame.start()

感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-01-18 01:40:28

是的,你需要使用计时器。如下所示:

代码语言:javascript
复制
I = 0

def change_next_color():
    if I < len(squares):
        squares[I].set_color("green")
        global I
        I += 1

timer = simplegui.create_timer(1000, change_next_color)
timer.start()

http://www.codeskulptor.org/#user47_udyXzppCdw2OqdI.py

我还用simplegui.Frame._hide_controlpanel = True替换了simplegui.Frame._hide_status = True

https://simpleguics2pygame.readthedocs.io/en/latest/simpleguics2pygame/frame.html#SimpleGUICS2Pygame.simpleguics2pygame.frame.Frame._hide_controlpanel

另请参阅SimpleGUICS2Pygame的_keep_timers选项,以帮助您:

https://simpleguics2pygame.readthedocs.io/en/latest/simpleguics2pygame/frame.html#SimpleGUICS2Pygame.simpleguics2pygame.frame.Frame._keep_timers

可能的改进:

  • 找到一个不使用全局计数器的更好的解决方案。
  • 在所有工作完成时停止计时器。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59788182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档