从画布取消所有小部件

时间:2017-06-23 17:47:50

标签: python canvas tkinter

我正在使用place(),而不是place_forget()手动每个小部件,有没有办法取消放置在canvas_resources上的所有小部件?

    from Tkinter import *

    root = Tk()
    root.geometry("200x200")

    canvas_state=1

    def toggle(event):
        global canvas_state
        if canvas_state==0:
            btn1_res.place_forget()
            btn2_res.place_forget()
            canvas_state=1
            return

        if canvas_state==1:
            btn1_res.place(x=30, y=10)
            btn2_res.place(x=30, y=50)
            canvas_state=0
            return

    canvas_resources = Canvas(root, height=200, width=100, bg='#182219')
    canvas_resources.place(x=-2, y=-2)
    btn1_res = Button(canvas_resources, text='TEXT1')
    btn2_res = Button(canvas_resources, text='TEXT2')
    btn3_res = Button(root, text='TEXT3')
    btn3_res.place(x=150, y=150)

    root.bind('<Return>', toggle)
    root.mainloop()

2 个答案:

答案 0 :(得分:2)

不,没有。如果您要“取消放置”添加了place的小部件,唯一的选择是为每个小部件调用place_forget

您可以使用place_slaves获取其他窗口小部件中place管理的所有窗口小部件的列表。例如,您可以这样做:

for widget in canvas_resources.place_slaves():
    widget.place_forget()

答案 1 :(得分:-2)

所以,按照@BryanOakley的方向,在循环中添加canvas.place_slaves()就是我要求的。

from Tkinter import *

root = Tk()
root.geometry("200x200")

canvas_state=1

def toggle(event):
    global canvas_state
    if canvas_state==0:
        for item in canvas_resources.place_slaves():
            item.place_forget()
        canvas_state=1
        return

    if canvas_state==1:
        btn1_res.place(x=30, y=10)
        btn2_res.place(x=30, y=50)
        canvas_state=0        
        return

canvas_resources = Canvas(root, height=200, width=100, bg='#182219')
canvas_resources.place(x=-2, y=-2)
btn1_res = Button(canvas_resources, text='TEXT1')
btn2_res = Button(canvas_resources, text='TEXT2')
btn3_res = Button(root, text='TEXT3')
btn3_res.place(x=150, y=150)


root.bind('<Return>', toggle)
root.mainloop()

谢谢!