Своя кнопка закрытия окна
Как сделать кнопку закрытия окна нестандартного размера 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 шт):
Результат:
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 = ?
При изменении размера шрифта меняется и размеры отступа по вертикали и горизонтали, в связи с этим сделал на шрифт 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()
