代码之家  ›  专栏  ›  技术社区  ›  Astrina

ipycanvas什么时候在画布上画画?或者如何强制?

  •  0
  • Astrina  · 技术社区  · 1 年前

    我试着在Jupyter为我的学生们写一些类似迷你游戏的东西,在那里他们像在Swift游乐场一样学习一个人物在应用不同命令时的行为。 我写了以下内容:

    from ipywidgets import Image
    from ipycanvas import *
    import time 
    
    char = Image.from_file("Bilder/charRight.png")
    
    bg = Image.from_file("Bilder/map.png")
    
    xchar=150
    ychar=170
    tilesize = 48
    
    canvas = Canvas(height=800, width=800)
    canvas.draw_image(bg,0,0 )
    canvas.draw_image(char, xchar, ychar)
    
    def step():
        time.sleep(3)
        global xchar
        global ychar
        global char
        canvas.draw_image(bg,0,0 )
        xchar = xchar+tilesize
        canvas.draw_image(char, xchar, ychar)
    
    step()
    print("yay")
    step()
    print("yay")
    canvas
    

    但我不明白,为什么它不是单独显示每一步,而是全部显示在最后? 如果你想推荐其他模块,我想使用的环境只能使用用python编写的模块。否则我会试试pygame。

    我试着在几个点上包括画布,认为这会迫使它画画,但没有这样做。

    0 回复  |  直到 1 年前
        1
  •  0
  •   Wayne    1 年前

    我认为这在一个完整的Python内核中是有效的,因为它不会等到最后才显示任何内容,并且它会移动 char 图像结束。(来自“发布活页夹”徽章的会话 here )我认为问题的一部分是你没有使用Jupyter的 display() 或者ipywidgets处理不正确。前一个问题是主要问题,所以画布直到在代码块中遇到最后一行代码才显示。我的建议如下:

    from ipywidgets import Image
    from ipycanvas import *
    import time 
    
    char = Image.from_file("single_document_mode_in_JupyterLab.png")
    
    bg = Image.from_file("ClassicNb_interface.png")
    
    xchar=150
    ychar=170
    tilesize = 48
    
    canvas = Canvas(height=800, width=800)
    canvas.draw_image(bg,0,0 )
    canvas.draw_image(char, xchar, ychar)
    
    display(canvas)
    
    def step():
        time.sleep(3)
        canvas.clear()
        global xchar
        global ychar
        global char
        canvas.draw_image(bg,0,0 )
        xchar = xchar+tilesize
        canvas.draw_image(char, xchar, ychar)
    
    step()
    print("yay")
    step()
    print("yay")
    

    我还添加了一个“清除”步骤。也许这不是你想要的?

    至于 print() ,我把它放在一边,因为我不知道你为什么要用它。我想你可能只是把它当作显示器,不在乎它到底打印到哪里?你不是真的想要 打印 如果您希望文本位于画布附近的任何位置。为了正确地将其与ipywidget一起使用,您可能希望在上下文管理器中使用它。如果您想用做一些不同的事情,请随时更新 print("yay") 关于它相对于图像和输出区域的走向。