Если я понимаю ваши требования, вы хотите, чтобы холст заполнил окно, даже когда размер окна изменяется.Tkinter может сделать это автоматически, если вы используете правильные опции grid
, pack
или place
.
Вы сделали это очень затруднительным, выбрав несколько слоев кадров, ииспользуйте grid
вместо pack
.Если вы помещаете только один виджет в другой (элемент управления вкладками в корневом окне, холст в рамке холста и т. Д.), Для использования pack
вместо grid
потребуется меньше строк кода.
Следующий код иллюстрирует, как я переписал бы ваш код, чтобы исключить некоторые дополнительные кадры и заставить автоматически увеличиваться вкладка ноутбука и холст с корневым окном.Я также добавил цвет на холст, чтобы его было проще визуализировать.
Обратите внимание на использование pack
вместо grid
при добавлении self
в корневое окно и при добавлении холста в рамку.Вы можете использовать grid
, если хотите, но для этого также необходимо настроить строки и столбцы, чтобы они имели ненулевой вес.Это легко сделать, но для такой простой схемы требуется три строки кода для grid
и одна строка для pack
.
from tkinter import *
from tkinter import ttk
class Test(Frame):
def Widgets(self):
self.tabcontrol = ttk.Notebook(self)
self.mainframe = Frame(self)
self.tabcontrol.add(self.mainframe, text = "TAB-1")
self.tabcontrol.pack(fill= "both", expand = YES)
self.canvas = Canvas(self.mainframe, background="bisque")
self.canvas.pack(fill="both", expand=True)
self.widgetframe = Frame(self.canvas)
self.canvas.create_window(100,100, window = self.widgetframe)
self.LABEL = Label(self.widgetframe, text = "LABEL-1")
self.LABEL.grid(row=1, column= 1)
self.BUTTON = Button(self.widgetframe, text = "BUTTON-1")
self.BUTTON.grid(row=1, column= 2)
def __init__(self,initial):
super(Test, self).__init__(initial)
self.pack(fill="both", expand=True)
self.Widgets()
root = Tk()
Software = Test(root)
root.mainloop()