【问题标题】:ttk.Notebook different grid size on each tabttk.Notebook 每个选项卡上的不同网格大小
【发布时间】:2023-03-28 09:12:01
【问题描述】:

我正在使用 Tkinter 创建一个 GUI,并且我已经使用 ttk.Notebook() 创建了多个选项卡。在 Tab1 上有一些标签和输入框,在 Tab2 我有一个 matplotlib 图。我只使用网格布局管理器。

我遇到的问题是,当我将绘图放在 Tab2 上(行 = 0)时,它似乎也增加了 Tab 1 上第 0 行的大小,在 2 个标签之间创建了很多空间(应该在另一个之上)。

(非常)代码的最小版本如下。我错过了什么?如何独立控制每个选项卡上的行高,以便 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()

【问题讨论】:

  • 删除你的测试用例中的self.makePlot(),你会看到有没有关系。
  • @stovfl - 是的,我在发布问题后确实注意到了这一点。在我的完整代码中,在我添加绘图之前,我没有遇到 Tab1 上的大行高的问题,所以我认为它们在某种程度上是相关的。关于如何控制 Tab1 上的行高的任何实际建议?
  • 你真的需要root == self. 上相同的grid 布局吗?

标签: python matplotlib tkinter ttk


【解决方案1】:

如果你注释掉这一行:

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

您会发现问题已经消失。您的问题来自您的 while 循环。我也可以说您的 while 循环没有按照您的想法执行。您只需将第 0 行配置为具有权重,这就是为什么您的第二个标签位于屏幕底部的原因。

让我们分解一下你的 while 语句在做什么。

row = 0 的第一个循环中,您告诉循环根据cols 执行另一个while 循环。所以它会执行 5 次 rowconfigure(0, weight=1)columnconfig(0 through 4, weight=1)。然而,问题出现在下一个循环上。因为cols = 5 现在您的第二个 while 循环将始终为 false,因此永远不会配置第 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)

通过这种方式,您可以确保对所有行和列应用权重。

【讨论】:

  • 谢谢迈克。我曾在某个时候考虑过这一点,但在遍历嵌套 while 循环的逻辑时显然感到困惑。你的建议就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
相关资源
最近更新 更多