ttk.Notebook отличается размером сетки на каждой вкладке - PullRequest
0 голосов
/ 07 ноября 2018

Я создаю графический интерфейс с помощью Tkinter и создал несколько вкладок с помощью ttk.Notebook (). На Tab1 есть несколько полей Labels и Entry, а на Tab2 у меня есть сюжет matplotlib. Я использую исключительно менеджер компоновки сетки.

Проблема, с которой я столкнулся, заключается в том, что, когда я помещаю график на вкладку Tab2 (в строке = 0), кажется, что он также увеличивает размер строки 0 на вкладке 1, создавая большое пространство между двумя надписями. (который должен быть прямо друг над другом).

(Очень) Минимальная версия кода приведена ниже. Чего мне не хватает? Как я могу независимо контролировать высоту строки на каждой вкладке, чтобы виджеты на Tab2 не устанавливали высоту строки на Tab1? Заранее спасибо за помощь.

import tkinter as tk
from tkinter import ttk

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.figure import Figure
matplotlib.use("TkAgg")


class MainGUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title('Title')
        self.geometry('750x500')

        # Adds tabs to main window
        self.nb = ttk.Notebook(self)
        self.nb.grid(row=0, column=0, columnspan=5, rowspan=4, sticky='NESW')
        self.tab1 = ttk.Frame(self.nb)
        self.nb.add(self.tab1, text='Tab1')
        self.tab2 = ttk.Frame(self.nb)
        self.nb.add(self.tab2, text='Tab2')

        # defines a grid 10 x 5 cells in the main window & tabs
        rows = 0
        cols = 0
        while rows < 10:
            while cols < 5:
                self.rowconfigure(rows, weight=1)
                self.columnconfigure(cols, weight=1)
                self.tab1.rowconfigure(rows, weight=1)
                self.tab1.columnconfigure(cols, weight=1)
                self.tab2.rowconfigure(rows, weight=1)
                self.tab2.columnconfigure(cols, weight=1)
                cols += 1
            rows += 1

        self.tab1Label = tk.Label(self.tab1, text="This is a Label")
        self.tab1Label.grid(column=0, row=0, sticky='NW')
        self.tab1Label2 = tk.Label(self.tab1, text="This is also a Label")
        self.tab1Label2.grid(column=0, row=1, sticky='NW')

        self.makePlot()

    def makePlot(self):
        f = Figure(figsize=(5, 5), dpi=100)
        a = f.add_subplot(111)
        a.plot([1, 2, 3, 4, 5, 6, 7, 8], [5, 6, 1, 3, 8, 9, 3, 5])
        canvas = FigureCanvasTkAgg(f, self.tab2)
        canvas.draw()
        canvas.get_tk_widget().grid(column=2, row=0, columnspan=2, sticky='NSEW')


def main():
    MainGUI().mainloop()


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 07 ноября 2018

Если вы закомментируете эту строку:

self.tab1.rowconfigure(rows, weight=1)

Вы заметите, что проблема исчезла. Ваша проблема исходит из вашей while петли. Я также могу сказать, что ваш while цикл не делает то, что вы думаете, он делает. Вы только конфигурируете строку 0, чтобы иметь вес, и именно поэтому ваша вторая метка находится внизу экрана.

Давайте разберем, что делает ваше while заявление.

В первом цикле, где row = 0 вы указываете циклу сделать еще один цикл while на основе cols. Так что тогда он делает rowconfigure(0, weight=1) 5 раз, а также делает columnconfig(0 through 4, weight=1). Однако проблема возникает в следующем цикле. Потому что cols = 5 теперь ваш второй цикл while всегда будет ложным и поэтому никогда не будет настраивать строки с 1 по 9.

Что вы должны сделать, это что-то вроде этого.

for i in range(10):
    self.tab1.rowconfigure(i, weight=1)
    self.tab2.rowconfigure(i, weight=1)
for i in range(5):
    self.tab1.columnconfigure(i, weight=1)
    self.tab2.columnconfigure(i, weight=1)

Таким образом, вы можете быть уверены, что примените вес ко всем строкам и столбцам.

...