如何同时移动两个 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 中放置在网格中的两个小部件之间添加空间?