J'ai travaillé sur les chapitres Tkinter dans Programmation Python et j'ai rencontré un problème où les couleurs de premier plan et d'arrière-plan d'un bouton ne changent pas. Je travaille sur un système Mac OS X 10.6 avec = Python 2.6.1. Les couleurs d'une étiquette changeront, mais pas les couleurs d'un bouton. Par exemple:
from Tkinter import *
Label(None, text='label', fg='green', bg='black').pack()
Button(None, text='button', fg='green', bg='black').pack()
mainloop()
Sur mon système Mac, les couleurs de l'étiquette changent, mais pas les couleurs du bouton. Sur un système Windows avec Python 2.6.1, les couleurs de l'étiquette et du bouton changent.
Quelqu'un sait ce qui ne va pas?
J'ai vérifié Interface Builder et il semble qu'il n'y ait pas d'option pour changer la couleur de premier plan ou d'arrière-plan d'un bouton dans cet outil. Il est possible de modifier les couleurs de premier plan et d'arrière-plan d'une étiquette.
Le système de rendu Mac OS X (Quartz?) Peut tout simplement ne pas prendre en charge (facilement) la modification des fg et bg d'un bouton.
Je pense que la réponse est que les boutons du mac ne prennent tout simplement pas en charge la modification des couleurs d'arrière-plan et de premier plan. Comme vous l'avez vu, ce n'est pas unique à Tk.
Pour tous ceux qui rencontrent cette question comme je l'ai fait, la solution consiste à utiliser le module ttk , qui est disponible par défaut sous OS X 10.7. Malheureusement, la définition de la couleur d'arrière-plan ne fonctionne toujours pas, mais la couleur du texte le fait.
Cela nécessite une petite modification du code:
Original:
from Tkinter import *
Label(None, text='label', fg='green', bg='black').pack()
Button(None, text='button', fg='green', bg='black').pack()
mainloop()
Avec ttk:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
# background="..." doesn't work...
ttk.Style().configure('green/black.TLabel', foreground='green', background='black')
ttk.Style().configure('green/black.TButton', foreground='green', background='black')
label = ttk.Label(root, text='I am a ttk.Label with text!', style='green/black.TLabel')
label.pack()
button = ttk.Button(root, text='Click Me!', style='green/black.TButton')
button.pack()
root.mainloop()
C'est assez ennuyeux qu'après des années, cela soit toujours un problème.
Quoi qu'il en soit, comme d'autres l'ont mentionné, le surbrillance fond (la couleur de la bordure) peut être utilisée à la place de l'arrière-plan sur un Mac. Si vous augmentez la taille de la bordure pour qu'elle soit énorme (la taille du bouton ou plus), vous obtiendrez une belle couleur d'arrière-plan unie. Cela donnera à votre bouton l'apparence d'une étiquette.
Cela fonctionne si vous utilisez place, mais pas si vous utilisez quelque chose comme la grille. Avec la grille, l'augmentation de la taille de la bordure augmente automatiquement la taille du bouton.
Cependant, si vous devez utiliser la grille, vous pouvez toujours la pirater .... créez votre bouton de grille incolore. Utilisez ensuite place pour parenter un bouton de couleur d'arrière-plan au-dessus. Ce sera le bouton avec la "commande" ou le bouton auquel vous liez les événements.
Si vous voulez que votre code soit indépendant du système d'exploitation, vous pouvez soit ajouter une instruction 'if OS == "Mac"' ou même ajouter une fonction personnalisée qui modifie le bouton s'il est sur un Mac mais le laisse seul sous Windows ou Linux. Voici le premier:
from tkinter import *
import platform
if platform.system() == "Darwin": ### if its a Mac
B = Button(text="Refersh All Windows", highlightbackground="Yellow", fg="Black", highlightthickness=30)
else: ### if its Windows or Linux
B = Button(text="Refresh All Windows", bg="Yellow", fg="Black")
B.place(x=5, y=10, width=140, height=30)
mainloop()
Cela a fonctionné pour moi:
self.gnuplot_bt = Button(
self.run_but_container, text="Plot with Gnuplot", font="Helvetica", command=self.gnuplot,
highlightbackground ="#8EF0F7", pady=2, relief=FLAT
)
Je cherchais pourquoi cela ne fonctionnait pas aussi bien. J'ai trouvé un moyen rapide d'essayer de le réparer: avoir une étiquette puis lier un clic avec l'étiquette. Demandez ensuite à l'étiquette de changer de couleur pendant un court instant pour imiter le clic. Voici un exemple.
def buttonPress(*args):
searchB.config(state = "active")
searchB.update()
time.sleep(0.2)
searchB.config(state = "normal")
## Whatever command you want
searchB = Label(main, text = "Search", bg = "#fecc14", fg = "Black", activebackground = "Red", highlightbackground="Black")
searchB.bind("<Button-1>", startSearch)
searchB.pack()
Vous pouvez le faire avec tkmacosx de Pypi
Installer:
pour python2
pip install tkmacosx
pour python3
pip3 install tkmacosx
from tkinter import *
from tkmacosx import Button
root = Tk()
B1 = Button(root, text='Mac OSX', bg='lightblue',fg='yellow', borderless=1)
B1.pack()
root.mainloop()
Cela fonctionne très bien sur mac os x.
P.S Pour plus d'informations, voir sur Pypi
Confirmez que le code suivant peut changer l'arrière-plan du bouton tkinter sur Mac OS X.
self.btn_open = tk.Button(self.toolbar,
text = "Open",
command=self.open,
highlightbackground = "gray")
Mais cela ne peut pas changer bg de ttk.Button.