【问题标题】:Canvas.scale output renders not always the sameCanvas.scale 输出渲染并不总是相同
【发布时间】:2016-10-16 05:16:00
【问题描述】:

我做了第一个简单的 tkinter 工具。它通过 FTP 连接到服务器并上传文件(用于将餐厅的菜单卡放在他们的服务器上)。 所有这一切都很好。 我正在尝试制作指示上传的动画。还有一个问题。

  • 主类继承自 Tk
  • 初始化菜单、按钮等相关:self.anim = Canvas(self, width=500, height=300) # Canvas for Animation self.anim.grid(column=0, row=5)
  • 最终,上传时调用self.animation()
  • 在那里我通过create_... 方法绘制了一个小PC,然后应该是什么卡片,缩小屏幕并向上。运行我看到大概 5 次运行中的 4 次运行它应该如何显示(到目前为止),但有时它看起来像是两次渲染动画(第二倍因素)并且这些是重叠的,放大两倍并且远远超出预定停止... 这不是一个好兆头,相同的输入,不同的输出。任何人都可以解释为什么会发生这种情况?

    x0, y0, x1, y1 = (185, 100, 190, 110)   # menucard
    ix0, iy0, ix1, iy1 = (187, 102, 189, 104)  # menucard's "image"
    self.speisekarte = self.anim.create_rectangle(x0, y0, x1, y1,   # menucard
                                                  outline='#bbb', fill='#fef',
                                                  stipple='gray75', tag='karte')
    self.karteimg = self.anim.create_rectangle(ix0, iy0, ix1, iy1,  # menucard's "image"
                                               outline='#f77', fill='#f57',
                                               stipple='gray50', tag='karte')
    self.anim.create_line(185, 100, 185, 109, tag='karte')
    self.anim.update()
    
    for z in range(13):
        self.anim.after(100, self.zoom())
    
    for z in range(50):
        self.anim.after(50, self.move())
    
    
    self.anim.create_text(350, 50, text='O N L I N E !', fill='#f57')
    

    def zoom(self): self.anim.scale('karte', 185, 110, 1.09, 1.06) self.anim.update()

    def move(self): self.anim.move('karte', 2, -1) self.anim.update()

【问题讨论】:

  • after 需要函数名称 - 这意味着没有 ()
  • 你说得对,这似乎是个问题!现在它快得要命了。那么,被调用函数之外的执行不会等待吗?在缩放/移动之前很久,它总是以create_text 结束。
  • 您在所有after() 中使用相同的时间,因此所有zoom() 都同时执行。您需要after(100,...)after(200, ...) 等,或者您可以在zoom() 中使用after(),例如在函数clock exampleupdate_time() 中使用update_time()

标签: macos python-3.x animation tkinter tkinter-canvas


【解决方案1】:

@furas 帮助我找到了解决方案。从那里我必须找到退出该功能的方法。我现在在哪里找到了一个例子,所以现在它是如何为我工作的:

def animdrawUpload(self): while self.move(): pass return True

def move(self):
    if self.anim.coords('karte')[0] > 300:
        return False
    self.anim.move('karte', 2, -1)
    self.anim.update()
    self.anim.after(100, self.move)
    return True

最后我只希望我能在 windows10 上得到同样的结果;)

【讨论】:

  • 你不需要self.anim.update(),如果这是内置的update 方法。我也不确定你为什么需要while self.move()——你应该只调用一次move,它会在你的程序的生命周期内运行。
  • 在 OS X 上它按照预期的方式工作。这样我可以控制动画的每一步并将其与上传状态同步..(ftp 函数连接=动画缩放,ftp 上传=动画移动,ftp succed=动画显示成功)。我现在所在的 Windows 可以毫不停顿地渲染它,速度很快。我改变了你的建议方式。使用self.after_cancel(self.move) 退出。现在引发索引错误。实际上,我只找到对用户输入做出反应的动画示例。它不应该在我的程序的生命周期内运行,它应该动画直到给定位置然后返回 True。
猜你喜欢
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 2020-09-06
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多