![](/img/trans.png)
[英]Python 2.7: How to change color of the ttk.Checkbutton label?
[英]Python: How to change the border color of ttk.Checkbutton when it is active?
我想更改 ttk.Checkbutton 小部件的邊框顏色,默認情況下它是淺藍色。 我嘗試使用 ttk.Style() 的配置功能,並設法在它處於活動狀態時更改整個按鈕或其他東西的顏色,但不是復選框的邊框。 附加問題是我可以在哪里找到此類信息,例如可以在 ttk 樣式中更改的所有選項的某種文檔?
這是我嘗試過的示例:
from tkinter import ttk
root = Tk()
s = ttk.Style()
s.configure('MyOwn.TCheckbutton',
background='white',)
s.map('MyOwn.TCheckbutton',
foreground=[('active', 'red')])
cb = ttk.Checkbutton(root,text='Text',style='MyOwn.TCheckbutton')
cb.pack()
root.mainloop()
當我將鼠標懸停在復選按鈕上時,我可以更改文本的顏色,但我沒有找到如何更改復選框的邊框顏色。
我相信您遇到的問題是Ttk Checkbutton實際上不是一個繪制的小部件,而是一個圖像。
如果查看 github 項目ttkthemes並查看themes 文件夾,然后轉到radiance 文件夾(這是一個類似 UBUNTU 的主題),然后轉到標有“radiance”的文件夾。
人們會看到這樣的事情: 我們看到一個充滿“GIF”的文件夾,這些是圖像文件,如果向下滾動並找到這些文件:
check-dc.gif (Disabled Deselected)
check-du.gif (Disabled Deselected)
check-nc.gif (Normal Selected)
check-nu.gif (Normal Deselected)
我們可以看到,如果我們查看這些文件,這些是復選按鈕的所有不同可能狀態。
在 Windows 下,這些復選按鈕看起來像這樣(使用此代碼生成):
可以在此處找到一篇關於此的精彩帖子,他們通過在畫布上添加綠色和紅色方塊來創建自定義復選按鈕,但是如果有人想要制作與您想要的類似的東西怎么辦。 更改復選按鈕顏色的位置。
首先讓我們將所有 Checkbutton 圖像轉換為 gif 格式,我已經為您完成了此操作,它們可以從我的 Google Drive或我的Gofile 下載。
您需要從我的 Google Drive 獲取:
check-nc.gif (Normal Selected)
check-nu.gif (Normal Deselected)
因為您無需擔心停用的值,因為它們永遠不會被關注。
現在讓我們看看他們如何加載上述帖子中的圖像:
on_image = tk.PhotoImage(width=48, height=24)
off_image = tk.PhotoImage(width=48, height=24)
on_image.put(("green",), to=(0, 0, 23,23))
off_image.put(("red",), to=(24, 0, 47, 23))
在這里,他們創建了兩張 48px X 24px 的空白圖像,其中兩張在左側添加了一個綠色方塊,另一張在右側添加了一個。
我們的方法將類似但略有不同,相反,我們將加載您下載的兩個 gif 文件,然后我們將編寫一個腳本,該腳本將創建 4 個矩形,這些矩形將覆蓋當前選中按鈕的灰色輪廓。 像這樣:
import tkinter as tk
root = tk.Tk()
def edit_check(colour, image):
image.put((colour,), to=(0, 0, 1, 13)) # LEFT
image.put((colour,), to=(0, 0, 13, 1)) # TOP
image.put((colour,), to=(12, 0, 13, 13)) # RIGHT
image.put((colour,), to=(0, 12, 13, 13)) # BOTTOM
def focus_in(event):
print(event)
image = off_image if var1.get() == 0 else on_image
edit_check("red", image)
cb1.configure(image=image)
cb1.image = image
def focus_out(event):
print(event)
image = off_image if var1.get() == 0 else on_image
edit_check("black", image)
cb1.configure(image=image)
cb1.image = image
on_image = tk.PhotoImage(file="check-nc.gif") # Instead of creating a new image we open an existing one
off_image = tk.PhotoImage(file="check-nu.gif") # Instead of creating a new image we open an existing one
var1 = tk.IntVar(value=0)
cb1 = tk.Checkbutton(root, image=off_image, selectimage=on_image, indicatoron=False,
onvalue=1, offvalue=0, variable=var1, offrelief='sunken')
cb1.pack(padx=20, pady=10)
# THESE IF YOU WANT TRUE FOCUS
#cb1.bind("<FocusIn>", focus_in)
#cb1.bind("<FocusOut>", focus_out)
# THESE IF YOU WANT MOUSE OVER
cb1.bind("<Enter>", focus_in)
cb1.bind("<Leave>", focus_out)
root.mainloop()
這是適合您的用例的更好的系統(請注意,它不需要任何圖像文件,因為文件保存為 base64 字符串)
import tkinter as tk
check_nu = b'iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TRZEWB4uIOGSoTi2IijpKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi4uqk6CIl/i8ptIjx4Lgf7+497t4BQqPCVLNrHFA1y0jFY2I2tyr2vCKAIAYRwYzETD2RXszAc3zdw8fXuyjP8j735wgqeZMBPpF4jumGRbxBPL1p6Zz3iUOsJCnE58QRgy5I/Mh12eU3zkWHBZ4ZMjKpeeIQsVjsYLmDWclQiaeIw4qqUb6QdVnhvMVZrdRY6578hYG8tpLmOs0RxLGEBJIQIaOGMiqwEKVVI8VEivZjHv5hx58kl0yuMhg5FlCFCsnxg//B727NwuSEmxSIAd0vtv0xCvTsAs26bX8f23bzBPA/A1da219tALOfpNfbWvgI6N8GLq7bmrwHXO4AQ0+6ZEiO5KcpFArA+xl9Uw4YuAX61tzeWvs4fQAy1NXyDXBwCIwVKXvd4929nb39e6bV3w/0UXLbKEvbjQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+MMDRctIGmzOYIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAALElEQVQoz2M0Njb+z0AiYGFgYGA4c+YMI7EaTExM/jMxkAFGNQ1jTYzkpD0ATtMHS/nRiQwAAAAASUVORK5CYII='
check_nc = b'iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TRZEWB4uIOGSoTi2IijpKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi4uqk6CIl/i8ptIjx4Lgf7+497t4BQqPCVLNrHFA1y0jFY2I2tyr2vCKAIAYRwYzETD2RXszAc3zdw8fXuyjP8j735wgqeZMBPpF4jumGRbxBPL1p6Zz3iUOsJCnE58QRgy5I/Mh12eU3zkWHBZ4ZMjKpeeIQsVjsYLmDWclQiaeIw4qqUb6QdVnhvMVZrdRY6578hYG8tpLmOs0RxLGEBJIQIaOGMiqwEKVVI8VEivZjHv5hx58kl0yuMhg5FlCFCsnxg//B727NwuSEmxSIAd0vtv0xCvTsAs26bX8f23bzBPA/A1da219tALOfpNfbWvgI6N8GLq7bmrwHXO4AQ0+6ZEiO5KcpFArA+xl9Uw4YuAX61tzeWvs4fQAy1NXyDXBwCIwVKXvd4929nb39e6bV3w/0UXLbKEvbjQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+MMDRctDrVlNE0AAAAjdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgd2l0aCBsb3ZlyGW0XgAAAJdJREFUKM+d0rENAyEMBdDvKA1zeART07MIGzAFE7EDK1B5CMqf7pIUlyP3JZdP+rItZkb8mScAjDFkF8QY+cCNbCF3R86ZvXduIXdHKYWqipSSXKJP0FqTEMK7Xu+dOWe6+yU4UEpJVBWlFLr7TwAAYmYcY8haC7VWzjkBAGfga+UhBLTWRFVPwREzI0nsjpndO67c+b0XBDxvkWRMW24AAAAASUVORK5CYII='
class example_window:
def __init__(self, master):
self.master = master
chckbox = custom_checkbox(master, "red")
chckbox.pack(padx=20, pady=10)
class custom_checkbox(tk.Checkbutton):
def __init__(self, parent, colour, *args, **kwargs):
default_kwargs = {'image': None, 'selectimage': None, 'indicatoron': False,
'onvalue': 1, 'offvalue': 0, 'variable': None, 'offrelief': 'sunken'}
for key, value in default_kwargs.items():
if key not in kwargs:
kwargs[key] = value
self.colour = colour
self.curr_colour = "black"
self.hover = False
if kwargs['variable'] is None:
self.variable = kwargs['variable'] = tk.IntVar(value=1)
else:
self.variable = kwargs['variable']
print(kwargs, kwargs['variable'].get())
if kwargs['variable'].get() == 0:
if kwargs['image'] is None:
self.off_image = kwargs['image'] = tk.PhotoImage(data=check_nu)
else:
self.off_image = kwargs['image']
if kwargs['selectimage'] is None:
self.on_image = tk.PhotoImage(data=check_nc)
else:
self.on_image = kwargs['selectimage']
else:
if kwargs['image'] is None:
self.on_image = kwargs['image'] = tk.PhotoImage(data=check_nc)
else:
self.on_image = kwargs['image']
if kwargs['selectimage'] is None:
self.off_image = tk.PhotoImage(data=check_nu)
else:
self.off_image = kwargs['selectimage']
tk.Checkbutton.__init__(self, parent, *args, **kwargs)
self.bind("<Enter>", self.focus_in)
self.bind("<Leave>", self.focus_out)
self.variable.trace("w", self.focus_update)
def edit_check(self, colour, image):
image.put((colour,), to=(0, 0, 1, 13)) # LEFT
image.put((colour,), to=(0, 0, 13, 1)) # TOP
image.put((colour,), to=(12, 0, 13, 13)) # RIGHT
image.put((colour,), to=(0, 12, 13, 13)) # BOTTOM
def focus_in(self, event=None):
image = self.on_image if self.variable.get() == self['onvalue'] else self.off_image
self.edit_check(self.colour, image)
self.curr_colour = self.colour
self.configure(image=image)
self.image = image
self.hover = True
def focus_out(self, event=None):
image = self.on_image if self.variable.get() == self['onvalue'] else self.off_image
self.edit_check("black", image)
self.curr_colour = "black"
self.configure(image=image)
self.image = image
self.hover = False
def focus_update(self, *args):
if self.variable.get() == self['onvalue']:
image = self.on_image
else:
image = self.off_image
self.configure(image=image)
self.image = image
if self.hover:
self.focus_in()
def main():
root = tk.Tk()
example_window_gui = example_window(root)
root.mainloop()
if __name__ == '__main__':
main()
如果您希望能夠向此小部件添加文本,請查看此代碼
您必須使用帶有 ttk checkbutton 的樣式圖,這與您可以使用配置的常規 tk 不同。 請參閱 2 個鏈接的參考文獻
地圖https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/ttk-map.html
ttk 檢查按鈕https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/ttk-Checkbutton.html
樣式信息鏈接
https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/ttk-style-layer.html
https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/ttk-layouts.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.