【问题标题】:notebook.add() returns bad window path namenotebook.add() 返回错误的窗口路径名
【发布时间】:2021-11-12 17:59:41
【问题描述】:

我正在尝试让 ttk 笔记本显示基于 2 个类的 2 个选项卡,代码如下:

import tkinter as tk
from tkinter import ttk


class Dashboard:
    def __init__(self,master):
        self.master = master
        self.frame = tk.Frame(self.master, width = 400, height = 400, bg = "red")
        self.frame.pack(expand = True)
class Options :
    def __init__(self,master):
        self.master = master
        self.frame = tk.Frame(self.master, width = 400, height = 400, bg = "blue")
        self.frame.pack(expand = True)
class Tabs:
    def __init__(self,master):
        self.master = master
        self.notebook = ttk.Notebook(self.master)
        self.options = Options(self.notebook)
        self.dashboard = Dashboard(self.notebook)
        self.notebook.add(self.options)
        self.notebook.add(self.dashboard)
        self.notebook.pack(pady=10, expand=True)


class MainGUI:
    def __init__(self,master):
        self.master = master
        self.tabs = Tabs(self.master)


if __name__ == '__main__':
    root = tk.Tk()
    gui = MainGUI(root)
    root.mainloop()

但是,当我运行它时,我有这个错误(仅当我尝试使用 ttk.Notebook 的“添加”方法时才会发生):_tkinter.TclError: bad window path name "<__main__.Options object at 0x0000016E51653DC0>"

我不明白为什么我的语法错误,有人可以帮助我吗? 非常感谢!!

【问题讨论】:

    标签: python tkinter ttk


    【解决方案1】:

    子窗格小部件通常是Frame 或其子类。我不确定你在做什么,但你可以通过从 tkinter Frame 类派生它们来消除错误(以及其他类的类似错误),如下所示:

    import tkinter as tk
    from tkinter import ttk
    
    
    class Dashboard(tk.Frame):
        def __init__(self,master):
            super().__init__(master)
            self.frame = tk.Frame(self.master, width=400, height=400, bg="red")
            self.frame.pack(expand=True)
    
    
    class Options(tk.Frame):
        def __init__(self,master):
            super().__init__(master)
            self.frame = tk.Frame(self.master, width=400, height=400, bg="blue")
            self.frame.pack(expand=True)
    
    class Tabs:
        def __init__(self,master):
            self.master = master
            self.notebook = ttk.Notebook(self.master)
            self.options = Options(self.notebook)
            self.dashboard = Dashboard(self.notebook)
            self.notebook.add(self.options)
            self.notebook.add(self.dashboard)
            self.notebook.pack(pady=10, expand=True)
    
    
    class MainGUI:
        def __init__(self,master):
            self.master = master
            self.tabs = Tabs(self.master)
    
    
    if __name__ == '__main__':
        root = tk.Tk()
        gui = MainGUI(root)
        root.mainloop()
    

    【讨论】:

    • 您好,非常感谢您的回答。它确实摆脱了错误,但老实说,我没有机会让它像我想要的那样工作。这个想法是有两个选项卡“仪表板”和“选项”,每个选项卡都有自己的内容。我可以使它工作的唯一方法是拥有(对于选项):class Options(tk.Frame): def __init__(self,*args,**kwargs): tk.Frame.__init__(self,*args,**kwargs),然后稍后在另一个课程中使用它。但是当我调用它时,我需要用所有大小、颜色...参数来声明它。我想在我的“选项”类中立即声明所有参数。
    • 如果您愿意,可以在 Options 类的 __init__() 方法中自动添加多个小部件。只需确保传递给 他们的 构造函数的第一个参数是self(即正在创建的Frame)。例如:Button(self, text='Something', command=function) 会将按钮放在Options 选项卡上,如果它是Notebook 的子项。
    • 非常感谢您抽出宝贵时间,我想我现在知道该怎么做了 :) 我将您的答案标记为已接受。
    猜你喜欢
    • 2020-02-03
    • 2021-01-12
    • 2020-06-10
    • 2020-11-14
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多