在canvas.delete“ all”之后重用画布中的框架小部件不起作用

问题描述

我已经在画布上创建了一个框架,然后单击鼠标来放置复选按钮。选择另一个单选按钮,我运行命令canvas.delete(“ all”)清除画布(以及带有复选按钮的框架),然后再次创建框架以继续放置复选按钮。框架被创建,但是我不能再放置复选按钮了(我也没有收到错误消息)。有人知道为什么吗?

from tkinter import *

root = Tk()
top_canvas = Canvas(root,width=676,height=768,bg='light blue')
top_canvas.pack()

frame = Frame(top_canvas,bg='light grey')
main_frame = top_canvas.create_window(500,780,height = 1600,width = 600,window = frame)

def place_checkbutton_in_canvas(e):  # order to insert the checkbutton
    xx = e.x
    yy = e.y
    buttons = Checkbutton(frame)
    buttons.place(x=xx,y=yy)

def place_checkbutton():  #to run when checkbutton is selected. Now the checkbutton will be placed where mouse clicked if choose_line is selected
    frame.bind('<Button-1>',place_checkbutton_in_canvas)

def clear_canvas():
    top_canvas.delete("all")
    frame = Frame(top_canvas,bg='magenta')
    main_frame = top_canvas.create_window(500,height=1600,width=600,window=frame)

chosen_option = Intvar()
choose_checkbutton = Radiobutton(root,text = "place checkbutton",variable=chosen_option,value = 1,command = place_checkbutton)
choose_checkbutton.place(x=10,y=10)
clear_button = Radiobutton(root,text = "clear everything",value = 2,command = clear_canvas)
clear_button.place(x=10,y=100)

root.mainloop()

解决方法

不需要删除画布上的所有项目。您可以使用列表保存所有复选框,然后使用.destroy()“删除”它们:

from tkinter import *

root = Tk()
top_canvas = Canvas(root,width=676,height=768,bg='light blue')
top_canvas.pack()
root.checkbutton_list = [] # initial a list

frame = Frame(top_canvas,bg='light grey')
main_frame = top_canvas.create_window(500,780,height = 1600,width = 600,window = frame)

def place_checkbutton_in_canvas(e):  # order to insert the checkbutton
    xx = e.x
    yy = e.y
    buttons = Checkbutton(frame)
    buttons.place(x=xx,y=yy)
    root.checkbutton_list.append(buttons) # append the checkbutton to the list

def place_checkbutton():  #to run when checkbutton is selected. Now the checkbutton will be placed where mouse clicked if choose_line is selected
    frame.bind('<Button-1>',place_checkbutton_in_canvas)

def clear_canvas():
    for i in root.checkbutton_list:
        i.destroy() # destroy all the checkbuttons in the list
    root.checkbutton_list = [] # init it again

chosen_option = IntVar()
choose_checkbutton = Radiobutton(root,text = "place checkbutton",variable=chosen_option,value = 1,command = place_checkbutton)
choose_checkbutton.place(x=10,y=10)
clear_button = Radiobutton(root,text = "clear everything",value = 2,command = clear_canvas)
clear_button.place(x=10,y=100)

root.mainloop()

如果您真的想将其与.delete(ALL)一起使用。您需要更改checkbutton的父容器。我使用root.frame覆盖上一帧。例如:

from tkinter import *

root = Tk()
top_canvas = Canvas(root,bg='light blue')
top_canvas.pack()

root.frame = Frame(top_canvas,window = root.frame)

def place_checkbutton_in_canvas(e):  # order to insert the checkbutton
    xx = e.x
    yy = e.y
    buttons = Checkbutton(root.frame)
    buttons.place(x=xx,y=yy)

def place_checkbutton():  #to run when checkbutton is selected. Now the checkbutton will be placed where mouse clicked if choose_line is selected
    root.frame.bind('<Button-1>',place_checkbutton_in_canvas)

def clear_canvas():
    top_canvas.delete("all")
    root.frame = Frame(top_canvas,bg='magenta')
    main_frame = top_canvas.create_window(500,height=1600,width=600,window=root.frame)

chosen_option = IntVar()
choose_checkbutton = Radiobutton(root,y=100)

root.mainloop()