有一个解决方案可以将画布窗口提升到其他画布窗口之上:如何更改画布中窗口项目的堆叠顺序? 但我无法在画布窗口项目上方提升非画布窗口项目(例如画布矩形)。 我怎样才能做到这一点?
这是一个示例代码,我尝试将矩形提升到画布窗口上方(该示例是从上面的链接复制并通过画布矩形扩展的):
root = tk.Tk()
canvas = tk.Canvas(root, bg="bisque")
canvas.pack(fill="both", expand=True)
def focus_win(event):
event.widget.lift()
for n, color in enumerate(("black", "red", "orange", "green", "blue", "white")):
win = tk.Frame(canvas, background=color, width=100, height=100)
x = 50 + n*20
y = 50 + n*20
canvas.create_window(x, y, window=win)
win.bind("<1>", focus_win)
rec = canvas.create_rectangle(x, y, x+100, y+100)
canvas.tag_raise(rec, "all")
root.mainloop()
但是我无法提出非画布窗口项目(例如 画布矩形)位于画布窗口项目上方。我怎样才能做到这一点?
你不能。 文档说:
画布中的项目是为了显示目的而排序的, 首先显示显示列表中的第一项,然后是 列表中的下一项,依此类推。显示列表中后面的项目 遮盖显示列表中较早的内容,有时会隐藏这些内容 被称为在早期项目的“之上”。当有新商品出现时 创建后它被放置在显示列表的末尾,在 其他一切。小部件命令可用于重新排列顺序 显示列表的。
窗户物品是上述规则的一个例外。底层的 窗口系统要求它们始终绘制在其他项目之上。 此外,窗口项的堆叠顺序不受任何影响 画布小部件命令;您必须使用 Tk raise 命令并且 改为降低命令。
或者你可以吗?
我的意思是你总是可以有多个画布作为窗口项并在这些画布中绘制你想要的内容。
你需要在raise函数中引用对象的tagid:
rec = canvas.create_rectangle(x, y, x+100, y+100,tags="dummy") canvas.tag_raise("虚拟", "全部")