Ответ 1
Я думаю, что ответ заключается в том, что кнопки на Mac просто не поддерживают изменение фона и цветов переднего плана. Как вы видели, это не уникально для Tk.
Я работал над разделами 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 кнопки.
Я думаю, что ответ заключается в том, что кнопки на Mac просто не поддерживают изменение фона и цветов переднего плана. Как вы видели, это не уникально для Tk.
Существует решение для изменения фона кнопок на Mac.
Использование:
highlightbackground=color
Например:
submit = Button(root, text="Generate", highlightbackground='#3E4149')
В результате получается следующая кнопка, которая подходит к фону:
Для всех, кто случается по этому вопросу, как и я, решение заключается в использовании модуля 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()
Это довольно раздражает, что спустя годы это все еще проблема.
В любом случае, как уже упоминалось, highlightbackground (цвет границы) можно использовать вместо фона на Mac. Если вы увеличите размер границы до огромного (размер кнопки или больше), вы получите красивый сплошной цвет фона. Это придаст вашей кнопке вид метки.
Это работает, если вы используете место, но не если вы используете что-то вроде сетки. При использовании сетки увеличение размера рамки, к сожалению, автоматически увеличивает размер кнопки.
Однако, если вам нужно использовать сетку, вы всегда можете взломать ее... создайте свою кнопку бесцветной сетки. Затем используйте место для родительской кнопки цвета фона поверх него. Это будет кнопка с "командой" или кнопка, с которой вы связываете события.
Если вы хотите, чтобы ваш код не зависел от ОС, вы можете либо добавить оператор 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()
Я смотрел, почему это не работает. Я нашел быстрый способ попытаться исправить это, чтобы иметь метку, а затем привязать клик с меткой. Затем на короткое время измените цвета ярлыков, чтобы имитировать щелчок. Вот пример.
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()
Это сработало для меня:
self.gnuplot_bt = Button(
self.run_but_container, text="Plot with Gnuplot", font="Helvetica", command=self.gnuplot,
highlightbackground ="#8EF0F7", pady=2, relief=FLAT
)
Подтверждение следующего кода может изменить фон кнопки tkinter на Mac OS X.
self.btn_open = tk.Button(self.toolbar,
text = "Open",
command=self.open,
highlightbackground = "gray")
Но он не может изменить bg ttk.Button.
Вы можете сделать это с 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