Как изменить цвет переднего плана или фона кнопки Tkinter на Mac OS X?

Я работал над разделами Tkinter в Python программирования и столкнулся с проблемой, когда цвета переднего плана и фона кнопки не будут меняться. Я работаю над системой Mac OS X 10.6 с Python 2.6.1. Цвета ярлыка будут меняться, но не цвета кнопки. Например:

from Tkinter import *

Label(None, text='label', fg='green', bg='black').pack()
Button(None, text='button', fg='green', bg='black').pack()

mainloop()

В моей системе Mac цвета ярлыка меняются, но цвета кнопки нет. В системе Windows с Python 2.6.1 меняются цвета как ярлыка, так и кнопки.

Кто-нибудь знает, что происходит не так?

Я проверил Interface Builder и, похоже, нет возможности изменить цвет фона или фона в этом инструменте. Существует возможность редактировать цвета переднего плана и фона ярлыка.

Система рендеринга Mac OS X (Quartz?) может просто не поддерживать (легко) изменение fg и bg кнопки.

Ответы

Ответ 1

Я думаю, что ответ заключается в том, что кнопки на Mac просто не поддерживают изменение фона и цветов переднего плана. Как вы видели, это не уникально для Tk.

Ответ 2

Существует решение для изменения фона кнопок на Mac.

Использование:

highlightbackground=color

Например:

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

В результате получается следующая кнопка, которая подходит к фону:

<w290"

Ответ 3

Для всех, кто случается по этому вопросу, как и я, решение заключается в использовании модуля ttk, который по умолчанию доступен по OS X 10,7. К сожалению, установка цвета фона по-прежнему не работает из коробки, но цвет текста делает.

Это требует небольшого изменения кода:

Оригинал:

from Tkinter import *

Label(None, text='label', fg='green', bg='black').pack()
Button(None, text='button', fg='green', bg='black').pack()

mainloop()

С 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()

Ответ 4

Это довольно раздражает, что спустя годы это все еще проблема.

В любом случае, как уже упоминалось, highlightbackground (цвет границы) можно использовать вместо фона на Mac. Если вы увеличите размер границы до огромного (размер кнопки или больше), вы получите красивый сплошной цвет фона. Это придаст вашей кнопке вид метки.

enter image description here

Это работает, если вы используете место, но не если вы используете что-то вроде сетки. При использовании сетки увеличение размера рамки, к сожалению, автоматически увеличивает размер кнопки.

Однако, если вам нужно использовать сетку, вы всегда можете взломать ее... создайте свою кнопку бесцветной сетки. Затем используйте место для родительской кнопки цвета фона поверх него. Это будет кнопка с "командой" или кнопка, с которой вы связываете события.

Если вы хотите, чтобы ваш код не зависел от ОС, вы можете либо добавить оператор if OS == "Mac", либо даже добавить пользовательскую функцию, которая изменяет кнопку, если она на Mac, но оставляет ее в одиночку в Windows или Linux. Вот первый:

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

Ответ 5

Я смотрел, почему это не работает. Я нашел быстрый способ попытаться исправить это, чтобы иметь метку, а затем привязать клик с меткой. Затем на короткое время измените цвета ярлыков, чтобы имитировать щелчок. Вот пример.

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

Ответ 6

Это сработало для меня:

    self.gnuplot_bt = Button(
        self.run_but_container, text="Plot with Gnuplot", font="Helvetica", command=self.gnuplot,
        highlightbackground ="#8EF0F7", pady=2, relief=FLAT
    )

Ответ 7

Подтверждение следующего кода может изменить фон кнопки tkinter на Mac OS X.

self.btn_open = tk.Button(self.toolbar,
                          text = "Open",
                          command=self.open,
                          highlightbackground = "gray")

Но он не может изменить bg ttk.Button.

Ответ 8

Вы можете сделать это с tkmacosx от Pypi
Установка:
для python2

pip install tkmacosx

для 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()

Он отлично работает на Mac OS X.

PS Информацию смотрите на Pypi