如何同时移动两个 tkinter 小部件但异步?

Posted

技术标签:

【中文标题】如何同时移动两个 tkinter 小部件但异步?【英文标题】:How can I move two tkinter widgets simultaneously but asynchronous? 【发布时间】:2021-04-28 13:19:23 【问题描述】:

问题是直截了当的。有什么办法可以在画布的同时将图像 A 向右移动。将图像 B 向左移动?

我之前通过使用多处理来运行分层的多个画布来实现这一点,但这是我编造的一种解决方法。

有没有官方/更好的方法来做到这一点?任何建议都有帮助。

【问题讨论】:

嗯,是的。一个简单的功能就可以完成这项工作。或者你可以考虑tag_bind?如果有解决您的问题所需的所有信息,我认为您应该查看您的问题。我不清楚您为什么需要我们的帮助。 一个简单的函数,比如什么? tag_bind 怎么样?我认为我说得很清楚,这也不是一个错误或任何关于我将如何去做的问题。我避免使用标签移动,因为据我所知,可以同时移动它们,但也可以同步移动,即 canvas.move(tag, amount) 当它们都有标签时,它们移动相同的数量和方向。 到目前为止你尝试了什么。 就像我说的,我尝试通过使顶部画布透明和多处理来分层画布。这行得通,但它非常笨拙,所以我想知道是否还有其他方法。我做了更多的研究,我将尝试以不同的方式进行多处理,方法是为每个对象创建一个 Toplevel 或 canvas.create_window,如下所示:***.com/questions/27233208/… 【参考方案1】:

您无需做任何特别的事情。只需同时为两个对象调用move 方法即可。当屏幕更新时,两者会同时更新。

例如,以下代码将在您每次按下键盘上的空格键时将每个图像移动 5 个像素:

import tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, background="black", width=400, height=400)
canvas.pack(fill="both", expand=True)

image_a = tk.PhotoImage(width=50, height=50)
image_b = tk.PhotoImage(width=50, height=50)
image_a.put(("#ff0000",), (0, 0, 49, 49))
image_b.put(("#00ff00",), (0, 0, 49, 49))

canvas.create_image(175, 200, image=image_a, tags=("image_a",))
canvas.create_image(225, 200, image=image_b, tags=("image_b",))

def sync_move(event):
    canvas = event.widget
    canvas.move("image_a", 5, 0)
    canvas.move("image_b", -5, 0)

canvas.bind("<space>", sync_move)
canvas.focus_set()

root.mainloop()

【讨论】:

据我所知,这不会按预期工作。对于两个移动一次,当然,但它们不会同时执行,只是快速连续执行。我鼓励您尝试使用许多对象进行此操作,最终您会注意到从第一个动作到最后一个动作的不同。如果您在递归循环中尝试,您也可以看到差异;当它们“同时”移动时,它们的移动速度会慢得多,因为它们实际上不是,它们只是在递归循环重新启动之前都被移动了 @Matt:您没有指定任何要求,所以我不知道“按预期”是什么意思。我尝试了 500 对图像,效果很好。如果您有需要处理的特定限制,您应该在问题中指定。如果您尝试为数千或数万张图像制作动画,则 tkinter 不是适合这项工作的工具。 这很公平。我并不是要为成千上万的人制作动画。如果它真的适用于 500 张图片,我会测试你的答案,如果结果很好,我很抱歉,谢谢 好吧,显然我是一个非常愚蠢和固执的人,一年多来一直让自己的事情变得更加困难。我之前曾尝试在主循环中连续运行两次 canvas.move 并注意到速度存在显着差异,但我现在认为这可能是由于其他问题。感谢您耐心地处理我的愚蠢 @Matt 这发生了。我在 500 行代码中这样做了 10 次,直到我得到它并将代码缩小到 200。快乐编码。 :D

以上是关于如何同时移动两个 tkinter 小部件但异步?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tkinter ~ python 中放置在网格中的两个小部件之间添加空间?

Tkinter规模小部件不实时更新

如何在不中断 tkinter 主循环的情况下运行一个函数,同时将该函数的信息发送到我的主循环中的小部件?

如何查看 Tkinter 中是不是存在小部件?

使用继承正确扩展 tkinter 小部件

如何将Tkinter Text小部件的撤消/重做历史记录复制到另一个小部件中