Я пытаюсь изменить разбиение виджетов Tkinter Canvas. С большинством виджетов вы можете заставить виджет над другими виджетами использовать метод лифта. Однако, если я попробую то же самое на виджетах Canvas, я получаю сообщение об ошибке.
Ошибка:
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()
Метод 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)
, то виджет холста будет поднят правильно.
Я пришел к этому вопросу, потому что я действительно хотел реализовать эквивалент оператора tk, например
canvas-pathName raise tagOrId ?aboveThis?
чтобы поднять отдельные элементы холста в определенную позицию z-. Для тех, кто интересуется тем же, я просто опубликую свое понимание (после небольшого head- царапания), что это можно сделать в Python довольно легко:
canvasObject.tag_raise(tagOrId, tagOrId2)
Второй аргумент здесь просто включается в командную строку tk и затем интерпретируется как значение "aboveThis".