无法将Tkinter小部件放入Toplevel Frame中

时间:2017-07-29 21:44:24

标签: python tkinter

我正试图通过按下按钮打开一个顶级小部件,并从我找到的示例中生成该框架内的列表。但是,当我尝试将窗口小部件放置在生成的框架中时,我收到以下错误:

_tkinter.TclError: can't put .!treeview inside .!errorexample.!toplevel.!mclistdemo.!frame.!frame

我已将问题缩小到

self.tree.grid( in_ = f, row = 0,column = 0,sticky = NSEW)

在_create_treeview方法中。删除in_命令后,将在父窗口中正确生成窗口小部件。我怀疑这个问题与我的父/自命名约定有关,但我仍然在努力去理解这个问题。

我遇到的大多数问题都是类似的描述似乎是在生成窗口时尝试放置窗口小部件,但在此代码中似乎并非如此。

from tkinter import *
from tkinter import ttk
from tkinter.font import Font

class ErrorExample(Frame):

    def __init__(self, parent):
        Frame.__init__(self,parent)
        self.grid()
        self.parent=parent

        self.b4=Button(
            self,
            text="Load",
            command=lambda: self.createWindow())
        self.b4.grid()

    def createWindow(self):
        self.t = Toplevel(self)
        MCListDemo(self)

class MCListDemo(ttk.Frame):

    def __init__(self, parent, isapp=True):
        ttk.Frame.__init__(self, parent.t)
        self.grid()
        self.isapp = isapp
        self._create_widgets()

    def _create_widgets(self):
        if self.isapp:
            self._create_demo_panel()

    def _create_demo_panel(self):
        demoPanel = Frame(self)
        demoPanel.grid()
        self._create_treeview(demoPanel)
        self._load_data()

    def _create_treeview(self, parent):
        f = ttk.Frame(parent)
        f.grid()
        self.dataCols = ('country', 'capital', 'currency')        
        self.tree = ttk.Treeview(columns=self.dataCols, 
                                 show = 'headings')
        self.tree.grid(in_=f, row=0, column=0, sticky=NSEW)

start=Tk()
ErrorExample(start)
if __name__=="__main__":
    main()

1 个答案:

答案 0 :(得分:1)

您不会将树视图设为父视图,因此它将根视窗作为父视图。窗口小部件位于层次结构中,窗口小部件不能放置在层次结构的不同部分中。

官方文档描述如下:

  

每个从站的主站必须是从站的父节点(默认值)或从站父节点的后代节点。这种限制是必要的,以保证从属设备可以放置在其主设备的任何可见部分上,而不会有从设备被其父设备剪切的危险。

如果您希望树视图位于f,最简单的方法是让f成为父级:

self.tree = ttk.Treeview(f, ...)
self.tree.grid(row=0, column=0, sticky=NSEW)