Как создать несколько вкладок для класса в tkinter - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь создать вкладки для каждого класса в tkinter. Но столкнулся с проблемой, что они лежат друг на друге.

Я уже пытался создать новый класс для Ноутбука, но результат тот же. Теперь я остановился на этом варианте.

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()

Итак, как я уже сказал, они лежат друг на друге. И вкладки даже не отображаются при запуске программы.

Upd: после изменения master на self. master to self

1 Ответ

0 голосов
/ 06 октября 2019

При создании класса, который наследуется от Frame, с намерением удерживать другие виджеты, основное правило заключается в том, что все дочерние виджеты должны быть потомками этого класса.

В вашем случае вы 'Я не делаю этого. Вы создаете блокнот, добавляете фреймы в блокнот, но виджеты внутри каждого фрейма устанавливаются как дочерние элементы корневого окна. Они должны быть дочерними элементами фреймов (например: self).

Вам необходимо определить self.mainframe и self.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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...