如何将notebook类添加到tk.toplevel中?

4bbkushb  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(344)

我需要一个笔记本类,因为我想创建框架示例,然后添加到其中。问题是ttk.notebook需要根窗口,我不知道如何给他顶级根主。
这就是代码:

class Notebook:
    def __init__(self,parent):
        super().__init__(parent)
        self.notebook=ttk.Notebook(parent) #if i give this, the program will add the notebook to the main window
        self.notebook.grid(row=1,column=0)

    def add_tab(self,title):
        frame=ttk.Frame(self.notebook,width=1280, height=280)
        frame.pack(fill='both',expand=True)
        self.notebook.add(frame,text=title)
        tx=tk.Text(frame)
        tx.pack()

class MainChat(tk.Toplevel): 
    def __init__(self, parent):
        super().__init__(parent)
        self.master=parent
        self.title("Test")
        self.iconbitmap("icon.ico")
        self.resizable(False,False)
        self.columnconfigure(0,weight=1)
        self.createwidg()

    def createwidg(self):
        self.titlelb=ttk.Label(self,text="Test",font=("Helvetica",16))
        self.nb1=Notebook(self.master)

        self.titlelb.grid(row=0,column=0,pady=(10,0))

        self.nb1.add_tab('Test')
1aaf6o9v

1aaf6o9v1#

主要问题:你需要

Notebook(self)

没有 .master 第二个问题:你的 class Notebook 不是真正的tkinter小部件,因此不需要 super().__init__(parent) 但是标准 super().__init__() . 甚至你也可以跳过这一行。
最低工作代码:

import tkinter as tk
from tkinter import ttk

class Notebook:

    def __init__(self, parent):
        #super().__init__(parent)  # no need it
        self.notebook = ttk.Notebook(parent)
        self.notebook.grid(row=1, column=0)

    def add_tab(self, title):
        frame = ttk.Frame(self.notebook, width=1280, height=280)
        frame.pack(fill='both', expand=True)

        self.notebook.add(frame, text=title)

        tx = tk.Text(frame)
        tx.pack()

class MainChat(tk.Toplevel):

    def __init__(self, parent):
        super().__init__(parent)
        self.master = parent
        self.title("Test")
        #self.iconbitmap("icon.ico")
        self.resizable(False, False)
        self.columnconfigure(0, weight=1)
        self.createwidg()

    def createwidg(self):
        self.titlelb = ttk.Label(self, text="Test", font=("Helvetica", 16))
        self.titlelb.grid(row=0, column=0, pady=(10, 0))

        self.nb1 = Notebook(self)  # without `.master`
        self.nb1.add_tab('Test')

def run():
    MainChat(root)

if __name__ == '__main__':        
    root = tk.Tk()
    b = tk.Button(root, text="Chat", command=run)
    b.grid(row=0, column=0)
    root.mainloop()

顺便说一句:
pep 8——python代码的样式指南
即:周围的空间 = ,空格后 ,

9rbhqvlz

9rbhqvlz2#

这有助于解决您的问题吗?
笔记本是一个很好的工具 Toplevel 类,该类支持无限制地创建子窗口小部件。
我定义了一个 Text 在里面 Tk Windows和两个 Listbox 里面的小部件 Notebook 小部件。
它使用类似于您的示例的层次结构。

import tkinter as tk
from tkinter import ttk

def flexx( o, r = 0, c = 0, rw = 1, cw = 1 ):
    '''flexx will control grid manager static|dymanic growth'''
    if r != None:
        o.rowconfigure( r, weight = rw )
    if c != None:
        o.columnconfigure( c, weight = cw )

class notebook( tk.Toplevel ):

    def __init__( self, master, title ):
        super().__init__( master )
        self.withdraw()
        self.transient( master )
        self.title( title )
        self.geometry( '200x100' )
        flexx( self )

        self.tab = ttk.Notebook( self )
        self.tab.grid( sticky='nsew' )

class MainChat( tk.Tk ):

    def __init__( self ):

        super().__init__()
        self.withdraw()
        self.title( 'Parent' )
        flexx( self )
        # master with text
        self.frame = tk.LabelFrame(
            self, labelanchor= 'n', text = 'ContainerA' )
        self.frame.grid( sticky='nsew' )
        flexx( self.frame )
        self.main = tk.Text( self.frame, undo = 1, wrap = 'none' )
        self.main.grid( sticky='nsew' )
        self.update_idletasks( )
        self.deiconify( )

        # notebook with listbox
        harry = notebook( self, 'Harry' )
        harry.frame = tk.LabelFrame(
            harry.tab, labelanchor= 'n', text = 'ContainerB' )
        harry.frame.grid( sticky='nsew' )
        flexx( harry.frame )
        harry.var = tk.StringVar( harry, value = dir( harry ) )
        harry.main = tk.Listbox( harry.frame, listvariable = harry.var )
        harry.main.grid( sticky='nsew' )

        harry.tab.add( harry.frame, text='Page 1' )

        harry.update_idletasks( )
        harry.deiconify( )

        # notebook with listbox
        susie = notebook( self, 'Susie' )
        susie.frame = tk.LabelFrame(
            susie.tab, labelanchor= 'n', text = 'ContainerC' )
        susie.frame.grid( sticky='nsew' )
        flexx( susie.frame )
        susie.var = tk.StringVar( susie, value = dir( susie ) )
        susie.main = tk.Listbox( susie.frame, listvariable = susie.var )
        susie.main.grid( sticky='nsew' )

        susie.tab.add( susie.frame, text='Page 1' )

        susie.update_idletasks( )
        susie.deiconify( )

if __name__ == '__main__':

    code = MainChat()
    code.mainloop()

相关问题