Tkinter画布问题
我正在尝试改变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)
,那么画布小部件就会被正确地抬起来。