python - tkinter:为什么不删除(“全部”)删除组合框和条目小部件?
问题描述
我的意思是整个小部件而不是里面的文本。我还试图在论坛上获得现有的解决方案。我已经剥离了代码以仅显示问题。
我的问题是......当我放置ComboBox
和Entry
小部件时canvas2
,它们不会被删除canvas2.delete("all")
。
如果您从菜单中选择“加权图”,然后选择“无向图”,则会出现问题。在“加权图”之后,ComboBox
和Entry
小部件仍然存在(其他所有内容都按预期删除)。我放了一个时间延迟和一些提示来显示问题。
from tkinter import *
from tkinter import ttk
import time
tk = Tk()
tk.geometry("970x660")
menubar = Menu(tk)
tk.config(menu=menubar)
wrapper1 = LabelFrame(tk, text="Display", height=500)
wrapper2 = LabelFrame(tk, text="Command", width=800)
# canvas was setup to be a vertically scrolling region, I have cut most of that code
# (but my problem does not lie with canvas, that's working fine)
canvas = Canvas(wrapper1, height=500)
canvas.pack(side=LEFT, fill="both", expand="yes")
myframe = Frame(canvas)
canvas.create_window((0,0), window=myframe, anchor="nw", height=500)
# Note: My problem lies on canvas2,
canvas2 = Canvas(wrapper2)
canvas2.pack(side=LEFT, fill="both", expand="yes")
canvas2.update()
wrapper1.pack(fill="both", expand="yes", padx=10, pady=0)
wrapper2.pack(fill="both", expand="yes", padx=10, pady=5)
def DoNothing():
print("Doing nothing!")
def BinaryTree(Weighted, Mode):
canvas.delete("all")
print("Before canvas2.delete...")
canvas2.delete("all")
print("...after canvas2.delete... now waiting 3 seconds so you can inspect if canvas2 is CLEAR... ")
print("...I would expect canvas2 to be clear but Combobox and Entry remain!... ")
canvas2.update()
tk.update()
time.sleep(3)
button1 = Button(canvas2, text = "Add Node", command= lambda: DoNothing(), width=13, anchor=W)
button1_window = canvas2.create_window(20, 40, anchor=W, window=button1)
entry1 = Entry(canvas2, width=10)
entry1.place(x=150, y=40, anchor=W)
button2 = Button(canvas2, text = "Add Edge", command= lambda: DoNothing(), width=13, anchor=W)
button2_window = canvas2.create_window(20, 80, anchor=W, window=button2)
cb1 = ttk.Combobox(canvas2, values=DoNothing(), postcommand=lambda: DoNothing(), width=13, state="readonly")
cb1.place(x=150, y=80, anchor=W)
cb2 = ttk.Combobox(canvas2, values=DoNothing(), postcommand=lambda: DoNothing(), width=13, state="readonly")
cb2.place(x=260, y=80, anchor=W)
if Weighted == True:
canvas2.create_text(380, 80, text="Weight:", anchor=W)
entry2 = Entry(canvas2, width=4)
entry2.place(x=429, y=80, anchor=W)
button3 = Button(canvas2, text = "Delete All Nodes", command= lambda: DoNothing(), width=13, anchor=W)
button3_window = canvas2.create_window(420, 40, anchor=W, window=button3)
canvas2.update()
tk.update()
lmenu = Menu(menubar)
menubar.add_cascade(label="Learning Menu", menu=lmenu)
lmenu.add_command(label="Weighted Graph", command= lambda: BinaryTree(True, "DirectedGraph"))
lmenu.add_command(label="Undirected Graph", command= lambda: BinaryTree(False, "UndirectedGraph"))
while True:
tk.update_idletasks()
tk.update()
time.sleep(0.01)
解决方案
为什么 delete(“all”) 不能删除 Combobox 和 Entry 小部件?
这就是 tkinter 的工作原理。canvasdelete
方法只删除画布对象。这意味着,在画布上创建的对象使用“创建”函数(create_rectangle
、、create_window
等)。对于窗口对象,该delete
方法将删除创建的画布对象,create_window
但并非旨在删除与该窗口对象关联的小部件。
与任何小部件一样,要删除实际的小部件,您需要调用destroy
小部件本身的方法。
我的问题是......当我将 ComboBox 和 Entry 小部件放在 canvas2 上时,它们不会被 canvas2.delete("all") 删除。
那是因为当您使用 时place
,您不会创建画布对象。要使delete
命令起作用,您必须调用create_window
组合框和条目小部件。
推荐阅读
- python - 如何将 2D 和 1D 类(分别为单热编码和常规整数)的混合输入到 Keras 序列模型中?
- java - android - java.lang.ArrayIndexOutOfBoundsException:长度=4;index = 4长度数组 - Thinbug
- marklogic - 使用管理 API 在 MarkLogic 9.2 上设置元数据字段
- django - 在 Django 默认环境之外的数据库中替换/更改文件路径
- portal - 我可以从 TFS/VSTS 发布 Dynamics 365 门户页面吗
- php - 如何在 Laravel 中将元字段添加到 Eloquent 模型对象的集合中
- hibernate - HQL 奇怪的行为
- opengl - 如何将 opengl 用于 nana c++ 库?
- c++ - 为什么找不到我的着色器属性?
- optimization - 确切的 Broadcom B43 驱动程序