Своя кнопка закрытия окна

Как сделать кнопку закрытия окна нестандартного размера 16х16 средствами tkinter?
Иконка - крестик(символ), чтобы не было лишних файлов, при наведении на кнопку крестик меняет цвет.
Без рамок, цвет фона неизменный.

Пробовал:
tk.Button - не получилось убрать отступы текста
ttk.Button - нет параметра height
tk.Label - нет параметра height

Пример кода:

import tkinter as tk
from tkinter import ttk
from tkinter import TOP, BOTTOM, LEFT, RIGHT, BOTH, RAISED, N, E, S, W, X, Y

root = tk.Tk()

mw = tk.Frame(root, background='red', width=100, height=100)
tl = tk.Label(mw, text='Test', fg="#333333", bg="#CCCCCC", font = "Courier 16 bold", bd=0)
tl.pack(side=RIGHT, fill=BOTH)
mw.pack(expand=1, fill=BOTH)

root.configure(highlightthickness=5, highlightcolor='green')
root.mainloop()

Результат:
введите сюда описание изображения

Проблема:
Сверху и снизу есть отступы около 4 пикселей, хотя слева и справа от текста отступ порядка 1 пикселя.

Можно ли отредактировать label таким образом?

(только не для всех label, а для одного)

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
style = ttk.Style()

fr = ttk.Frame(root).pack()

mb = ttk.Menubutton(fr, text='fegvd').pack()

style.layout("TMenubutton", [
   ("Menubutton.background", None),
   ("Menubutton.button", {"children":
       [("Menubutton.focus", {"children":
           [("Menubutton.padding", {"children":
               [("Menubutton.label", {"side": "left", "expand": 1})]
           })]
       })]
   }),
])

root.mainloop()

Например как-то так:

style.layout("tl.TLabel": {"pady": "0"})

Ответы (2 шт):

Автор решения: biomotor

Результат:

import tkinter as tk

root = tk.Tk()

class MLabel():
    def __init__(self, parent, text='Text', fill='black', font=('Calibri', 16), ratio=2/7, bg='#F2F2F2'):
        self.parent = parent
        self.text = text
        self.fill = fill
        self.font = font
        self.ratio = ratio
        self.bg = bg

        self.pady=int(self.font[1]*self.ratio)
        self.canvas = tk.Canvas(self.parent, bg=self.bg)
        self.canvas.grid()
        self.txtid = self.canvas.create_text(0, -self.pady, text=self.text, fill=self.fill, font=self.font, anchor='nw')
        self.bbox = self.canvas.bbox(self.txtid)
        self.canvas.configure(width=self.bbox[2], height=self.bbox[3]-self.pady)

label = MLabel(root, font=('Calibri', 50))

root.mainloop()

P.S. Если есть советы как улучшить, пишите.
И еще вопрос, каким образом сделать grid() после label = ?

→ Ссылка
Автор решения: biomotor

При изменении размера шрифта меняется и размеры отступа по вертикали и горизонтали, в связи с этим сделал на шрифт 12 размера отступы = 0, при изменении размера шрифта можно откорректировать размеры отступов за счет параметров padx и pady, которые могут принимать и отрицательные значения.

import tkinter as tk

root = tk.Tk()

class MLabel():
    def __init__(self, parent, text='Text', fill='black', font=('Calibri', 12), ratio=2/7, bg='#F2F2F2', padx=0, pady=0):
        self.parent = parent
        self.text = text
        self.fill = fill
        self.font = font
        self.ratio = ratio
        self.bg = bg
        self.padx = padx
        self.pady = pady

        self.canvas = tk.Canvas(self.parent, bg=self.bg, highlightthickness=0)
        self.canvas.grid()
        self.txtid = self.canvas.create_text(self.padx, self.pady-5, text=self.text, fill=self.fill, font=self.font, anchor='nw')
        self.bbox = self.canvas.bbox(self.txtid)
        self.canvas.configure(width=self.bbox[2]+2*self.padx, height=self.bbox[3]+self.pady-4)

label = MLabel(root, text='X',font=('Calibri', 16, 'bold'), padx=1, pady=-1)

root.mainloop()
→ Ссылка