web-dev-qa-db-fra.com

Comment changer la couleur de premier plan ou d'arrière-plan d'un bouton Tkinter sur Mac OS X?

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.

21
Anthony Cramp

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.

20
Bryan Oakley

Il existe une solution pour changer l'arrière-plan des boutons sur Mac.

Utilisation:

highlightbackground=color

Par exemple:

submit = Button(root, text="Generate", highlightbackground='#3E4149')

Il en résulte ce qui suit, un joli bouton qui correspond à l'arrière-plan:

Button

14
Luka Kerr

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()
13
Jason Oster

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.

enter image description here

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()
4
Mike McReynolds

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
    )
1
Thiago Lopes

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()
1
Daniel

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

0
Victor

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.

0
Ren Weibo