Python и tkinter: canvas.lift и canvas.lower на перекрывающихся кнопках не работают

Я создал две перекрывающиеся кнопки на холсте, используя tkinter и python 3.4:

кнопка1 ниже кнопки2

Теперь я хотел бы вывести кнопку 1 на передний план (кнопку, которую вы сейчас не видите, потому что она находится под кнопкой 2).

self.canvas.lift(self.button1)

Но почему-то это не работает. Просто ничего не происходит. Также опускание кнопки 2 не дает никакого эффекта. Ты можешь сказать мне, почему?

import tkinter as tk

class Example(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.canvas = tk.Canvas(self, width=400, height=400, background="bisque")
        self.canvas.create_text(50,10, anchor="nw", text="Click to lift button1")
        self.canvas.grid(row=0, column=0, sticky="nsew")
        self.canvas.bind("<ButtonPress-1>", self.click_on_canvas)

        self.button1 = tk.Button(self.canvas, text="button1")        
        self.button2 = tk.Button(self.canvas, text="button2")

        x = 40
        self.canvas.create_window(x, x, window=self.button1)
        self.canvas.create_window(x+5, x+5, window=self.button2)



    def click_on_canvas(self, event):

        print("lifting", self.button1)
        self.canvas.lift(self.button1)
        self.canvas.lower(self.button2)


if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

person venti    schedule 12.02.2016    source источник


Ответы (1)


Вместо того, чтобы вызывать lift() на холсте, вам нужно вызвать его непосредственно в экземпляре виджета:

def click_on_canvas(self, event):
    print("lifting", self.button1)
    self.button1.lift()
    self.button2.lower()   # Not necessary to both lift and lower

Это справедливо только для виджетов, отображаемых через окно на холсте.

Если бы вам нужно было рисовать такие объекты, как линии или прямоугольники, вы бы использовали lift() или tag_raise() на экземпляре холста, как делали раньше.

person MrAlexBailey    schedule 12.02.2016
comment
кстати: вам не нужно использовать button1.lift() и button2.lower() одновременно. Вы можете использовать button1.lift() или button2.lower(). - person furas; 12.02.2016
comment
Спасибо, jkdc. Это помогло. Я использовал tag_raise() для других вещей на холсте и думал, что окна работают так же. - person venti; 12.02.2016