_tkinter.TclError:窗口路径名称错误<;
在我的MVC应用程序中,我希望从xml文件加载数据,并在一个窗格窗口中的两个不同视图中显示它。 在左窗格中,我想在tk.ttk.Treeview中显示数据。 在右侧窗格中,我希望在tk.tkk.Canvas中显示数据 主要用途:_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
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, ...)
...