_tkinter.TclError:窗口路径名称错误<;

_tkinter.TclError:窗口路径名称错误<;,tkinter,Tkinter,在我的MVC应用程序中,我希望从xml文件加载数据,并在一个窗格窗口中的两个不同视图中显示它。 在左窗格中,我想在tk.ttk.Treeview中显示数据。 在右侧窗格中,我希望在tk.tkk.Canvas中显示数据 主要用途: from lscController import Controller if __name__ == '__main__': c = Controller() c.run() 控制器: try: import Tkinter as Tk

在我的MVC应用程序中,我希望从xml文件加载数据,并在一个窗格窗口中的两个不同视图中显示它。 在左窗格中,我想在tk.ttk.Treeview中显示数据。 在右侧窗格中,我希望在tk.tkk.Canvas中显示数据

主要用途:

from lscController import Controller

if __name__ == '__main__':
    c = Controller()
    c.run()

控制器:

try:
    import Tkinter as Tk # python 2
except ModuleNotFoundError:
    import tkinter as Tk # python 3

from lscView import LSCGUI

class Controller:
    def __init__(self):
        self.root = Tk.Tk()
        self.model = LSCDocument('name')
        self.view = LSCGUI(self.root, self.model)

    def run(self):
        self.root.title("MVC Charts")
        self.root.deiconify()
        self.root.mainloop(
文件lscTreeView.py

class LSCTree():
    def __init__(self, window,model):
        super().__init__()
        frame = tk.Frame(window)
        frame.pack()
class LSCGUI():
    def __init__(self, window, model):
        super().__init__()
        self.window = window
        self.window.title("Model")
        self.model = model
        ''' Full Screen Or not '''
        self.window.attributes('-fullscreen',False)
        self.window.geometry('800x600')


        ''' ________Frame as paned windows (left / right)________ '''
        pwstyle = tk.ttk.Style()
        pwstyle.configure('TPanedwindow ', foreground='green')
        self.frame = tk.ttk.PanedWindow(style='TPanedwindow',orient=tk.VERTICAL)
        self.frame.pack(fill=tk.BOTH, expand=True)
        self.treeview=TREE.LSCTree(self.frame,model)
        self.frame.add(self.treeview)

我想将视图添加到文件lscView.py中PanedWindow的左窗格中:

class LSCTree():
    def __init__(self, window,model):
        super().__init__()
        frame = tk.Frame(window)
        frame.pack()
class LSCGUI():
    def __init__(self, window, model):
        super().__init__()
        self.window = window
        self.window.title("Model")
        self.model = model
        ''' Full Screen Or not '''
        self.window.attributes('-fullscreen',False)
        self.window.geometry('800x600')


        ''' ________Frame as paned windows (left / right)________ '''
        pwstyle = tk.ttk.Style()
        pwstyle.configure('TPanedwindow ', foreground='green')
        self.frame = tk.ttk.PanedWindow(style='TPanedwindow',orient=tk.VERTICAL)
        self.frame.pack(fill=tk.BOTH, expand=True)
        self.treeview=TREE.LSCTree(self.frame,model)
        self.frame.add(self.treeview)

并获取以下错误:

_tkinter.TclError: bad window path name "<lscTreeView.LSCTree object at 0x00000222D62B5910>"
\u tkinter.TclError:错误的窗口路径名“”

VS Code表示错误在这里:self.frame.add(self.treeview)

在这里,您将self.treeview传递给一个需要小部件作为参数的函数:

self.frame.add(self.treeview)
这是定义self.treeview的地方:

self.treeview=TREE.LSCTree(self.frame,model)
这是LSCTree的定义:

class LSCTree():
    def __init__(self, window,model):
        ...
LSCTree
显然不是一个小部件。不能将非小部件添加到panedwindow

最好的解决方案是使
LSCTree
Frame
继承,这样就可以将其视为一个小部件,而不是使用组合将一个Frame作为
LSCTree
的属性

class LSCTree(tk.Frame):
    def __init__(self, window,model):
        super().__init__(window)
        ...
        self.tree = ttk.Treeview(self, ...)
        ...

在这里,您将self.treeview传递给一个需要小部件作为参数的函数:

self.frame.add(self.treeview)
这是定义self.treeview的地方:

self.treeview=TREE.LSCTree(self.frame,model)
这是LSCTree的定义:

class LSCTree():
    def __init__(self, window,model):
        ...
LSCTree
显然不是一个小部件。不能将非小部件添加到panedwindow

最好的解决方案是使
LSCTree
Frame
继承,这样就可以将其视为一个小部件,而不是使用组合将一个Frame作为
LSCTree
的属性

class LSCTree(tk.Frame):
    def __init__(self, window,model):
        super().__init__(window)
        ...
        self.tree = ttk.Treeview(self, ...)
        ...