ttk.Notebook 每个选项卡上的不同网格大小
ttk.Notebook different grid size on each tab
我正在使用 Tkinter 创建一个 GUI,并且我已经使用 ttk.Notebook() 创建了多个选项卡。在 Tab1 上有一些标签和输入框,在 Tab2 上我有一个 matplotlib 图。我专门使用网格布局管理器。
我 运行 遇到的问题是,当我将绘图放在 Tab2 上(在行 = 0 中)时,它似乎也增加了 Tab 1 上第 0 行的大小,创建了很多2 个标签之间的 space 个(应该在另一个标签之上)。
(非常)代码的最小版本如下。我错过了什么?如何独立控制每个选项卡上的行高,以便 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.tab1.rowconfigure(rows, weight=1)
您会发现问题已解决。您的问题来自 while
循环。我还可以说你的 while
循环没有按照你认为的那样做。您只需将第 0 行配置为具有权重,这就是为什么您的第二个标签位于屏幕底部的原因。
让我们分解一下您的 while
语句在做什么。
在 row = 0
的第一个循环中,您告诉循环根据 cols
执行另一个 while
循环。所以它然后 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)
这样您就可以确保对所有行和列应用权重。
我正在使用 Tkinter 创建一个 GUI,并且我已经使用 ttk.Notebook() 创建了多个选项卡。在 Tab1 上有一些标签和输入框,在 Tab2 上我有一个 matplotlib 图。我专门使用网格布局管理器。
我 运行 遇到的问题是,当我将绘图放在 Tab2 上(在行 = 0 中)时,它似乎也增加了 Tab 1 上第 0 行的大小,创建了很多2 个标签之间的 space 个(应该在另一个标签之上)。
(非常)代码的最小版本如下。我错过了什么?如何独立控制每个选项卡上的行高,以便 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.tab1.rowconfigure(rows, weight=1)
您会发现问题已解决。您的问题来自 while
循环。我还可以说你的 while
循环没有按照你认为的那样做。您只需将第 0 行配置为具有权重,这就是为什么您的第二个标签位于屏幕底部的原因。
让我们分解一下您的 while
语句在做什么。
在 row = 0
的第一个循环中,您告诉循环根据 cols
执行另一个 while
循环。所以它然后 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)
这样您就可以确保对所有行和列应用权重。