如何在 tkinter 中为 class 创建多个制表符

How to create multiply tabs for class in tkinter

我正在尝试为 tkinter 中的每个 class 创建选项卡。但是遇到了一个问题就是他们互相趴着。

我已经尝试为 Notebook 创建一个新的 class,但结果是一样的。现在我停在这个变体上。

from tkinter import *
from tkinter import ttk

class Application(ttk.Frame):

    def __init__(self, master):
        ttk.Frame.__init__(self, master)
        self.master = master
        self.mainframe = ttk.Frame(master, padding='10 10 15 15')
        self.mainframe.grid(column=0, row=0, sticky=N+S+W+E)
        self.connectionCheck()
        self.connectionConf()
        self.measureFrame()
        self.meas()
        self.logview()
        self.running = None
#It have other functions. But I think they not really necessary

class Mapframe(ttk.Frame):
    def __init__(self, master):
        ttk.Frame.__init__(self, master)
        self.master = master
        self.mapframe = ttk.Frame(master, padding='10 10 15 15')
        self.mapframe.grid(column=0, row=0, sticky=N + W + E + S)
        self.choosefiles()
        self.meas()

window = Tk()
notebook = ttk.Notebook(window)
tab1 = Application(notebook)
tab2 = Mapframe(notebook)
notebook.add(tab1, text='Tab1')
notebook.add(tab2, text='Tab2')
notebook.grid(row=0, column=0)
notebook.mainloop()
notebook.quit()

所以,正如我所说,他们躺在彼此身上。程序启动时甚至不显示选项卡。

更新:将 master 更改为 self 后。

当创建从 Frame 继承的 class 时,为了保存其他小部件,一个基本规则是所有子小部件都应该是 class 的子部件。

在你的情况下,你没有这样做。您正在创建笔记本,向笔记本添加框架,但每个框架内的小部件都被设置为根 window 的子级。它们需要是帧的子帧(例如:self)。

您需要定义 self.mainframeself.mapframe,如下例所示。注意使用 self 而不是 master 作为第一个参数:

self.mainframe = ttk.Frame(self, padding='10 10 15 15')
...
self.mapframe = ttk.Frame(self, padding='10 10 15 15')

您唯一应该使用 master 作为小部件父级的地方是在调用 ttk.Frame.__init__(self, master) 时。在其他任何时候,您都不应该将小部件放在 master