Tkinter画布问题

1 投票
2 回答
2704 浏览
提问于 2025-04-16 18:58

我正在尝试改变Tkinter画布(Canvas)小部件的层级顺序。对于大多数小部件,你可以通过使用lift方法来把一个小部件放到其他小部件的上面。但是,如果我在画布小部件上使用同样的方法,就会出现错误。

错误信息:

TypeError: tag_raise() got an unexpected keyword argument 'aboveThis'

这是我遇到问题的一个例子:

import Tkinter as Tk


root = Tk.Tk()

w, h = 200, 200

a = Tk.Canvas(root, bg='red', width=w, height=h)
a.grid(column=0, row=0)

b = Tk.Canvas(root, bg='blue', width=w, height=h)
b.grid(column=0, row=0)

a.lift(aboveThis=None)

root.mainloop()

如果我对框架(Frame)小部件做同样的操作,那就可以正常工作。

示例:

import Tkinter as Tk


root = Tk.Tk()

w, h = 200, 200

a = Tk.Frame(root, bg='red', width=w, height=h)
a.grid(column=0, row=0)

b = Tk.Frame(root, bg='blue', width=w, height=h)
b.grid(column=0, row=0)

a.lift(aboveThis=None)

root.mainloop()

2 个回答

1

我之所以关注这个问题,是因为我想实现一个类似于tk语句的功能,比如

canvas-pathName raise tagOrId ?aboveThis?

这样可以把画布上的某些元素提升到特定的z轴位置。对于那些对这个功能感兴趣的人,我想分享一下我的发现(经过一番思考后),其实在Python中实现这个功能非常简单:

canvasObject.tag_raise(tagOrId, tagOrId2)

这里的第二个参数会被加入到tk命令行中,然后被解释为一个“在这个之上”的值。

3

canvas的lift()方法其实是tag_raise()的别名,它的作用不是把整个画布抬起来,而是把画布里面的元素抬起来。

我在Tkinter.py的源代码里发现了这个评论:

# lower, tkraise/lift hide Misc.lower, Misc.tkraise/lift,
# so the preferred name for them is tag_lower, tag_raise
# (similar to tag_bind, and similar to the Text widget);
# unfortunately can't delete the old ones yet (maybe in 1.6)

如果你把a.lift(aboveThis=None)替换成Tk.Misc.lift(a, aboveThis=None),那么画布小部件就会被正确地抬起来。

撰写回答