在画布.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, 780, 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", variable=chosen_option, 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", variable=chosen_option, 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,width=676,height=768, bg='light blue')
top_canvas.pack()
root.frame = Frame(top_canvas, bg='light grey')
main_frame = top_canvas.create_window(500, 780, height = 1600, width = 600, 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, 780, height=1600, width=600, window=root.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", variable=chosen_option, value = 2, command = clear_canvas)
clear_button.place(x=10, y=100)
root.mainloop()

最新更新