TkInter Python:Destroyed小部件仍然显示并覆盖新的小部件

时间:2015-08-04 16:18:49

标签: python matplotlib tkinter

我正在制作一个具有单选按钮的GUI,以选择要显示的不同信息。它可以显示树视图或matplotlib图。树视图效果很好,我可以在不同的树之间来回切换。如果我从图表开始,它也表现得很好。挑战在于,如果我从树视图进入图表视图,图表将隐藏在树视图后面,即使树视图已被破坏。

elif self.show.get()=="graph":
    f = makeGraph(int(self.gameType.get()))
    for child in self.display_frame.winfo_children(): child.destroy()
    canvas = FigureCanvasTkAgg(f,master = self.display_frame)
    canvas.show()
    canvas.get_tk_widget().grid(column=0,row=0,sticky=(N,S,E,W))

makeGraph函数只返回一个matplotlib图对象。

我希望树视图消失,图表出现并调整框架大小以适应(更大)图形。

相反,框架被调整大小(图形的一小部分在底部可见),但是树视图会随之调整大小,尽管被破坏,仍会以某种方式保留。

使用以下代码在其他地方创建树视图:

for child in self.display_frame.winfo_children(): child.destroy()
self.tree = ttk.Treeview(columns=self.tree_headers, show="headings")
vsb = ttk.Scrollbar(orient="vertical", command=self.tree.yview)
#hsb = ttk.Scrollbar(orient="horizontal", command=self.tree.xview)
self.tree.configure(yscrollcommand=vsb.set)
self.tree.grid(column=0, row=0, sticky=(N,S,E,W), in_=self.display_frame)

1 个答案:

答案 0 :(得分:0)

所以经过一些游戏,我意识到了

for child in self.display_frame.winfo_children(): child.destroy()

无法可靠地破坏树视图。它甚至找不到它。我认为这必须与树的创建方式有关。层次结构是使用关键字"在_"中建立的。在网格调用内。所以我更改了代码以明确删除有问题的小部件和改进的东西。

f = makeGraph(int(self.gameType.get()))
try:
    self.vsb.destroy()
except:
    pass
try:
    self.tree.destroy()
except:
    pass
try:
    self.toolbar.destroy()
except:
    pass
try:
   self.canvas.get_tk_widget().destroy()
except:
   pass

self.canvas = FigureCanvasTkAgg(f,master = self.display_frame)
self.canvas.show()
self.canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
self.toolbar = NavigationToolbar2TkAgg( self.canvas, self.display_frame )
self.toolbar.update()
self.canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=1)