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

Я работал над главами Tkinter в Programming 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 кнопки.


person Anthony Cramp    schedule 07.10.2009    source источник
comment
Теперь есть лучший ответ — используйте tkmacosx. Простота установки через pip - требования выглядят довольно прямолинейно... насколько я могу судить, все это чистый python и доступно на pypi. Спасибо Виктору ВосМотору за упоминание об этом: stackoverflow.com/a/57127191/901641   -  person ArtOfWarfare    schedule 19.09.2020


Ответы (8)


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

person Bryan Oakley    schedule 07.10.2009

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

Использовать:

highlightbackground=color

Например:

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

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

Кнопка

person Luka Kerr    schedule 04.03.2017
comment
работает и на каталине 10.15, спасибо. @ anthony-cramp рассмотрите возможность изменения принятого ответа. - person abhinonymous; 01.12.2019
comment
отлично, это решило мою проблему! - person 1QuickQuestion; 13.03.2021

Для всех, кто сталкивается с этим вопросом, как и я, решение состоит в том, чтобы использовать 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()

С ТТК:

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()
person Jason Oster    schedule 03.03.2012

Вы можете сделать это с помощью библиотеки tkmacosx из PyPI.

Установка:

  • Для Python 2 используйте pip install tkmacosx.

  • Для Python 3 используйте pip3 install tkmacosx.


Вот как вы используете tkmacosx:

from tkinter import *
from tkmacosx import Button

root = Tk()

B1 = Button(root, text='Mac OSX', bg='black',fg='green', borderless=1)
B1.pack()

root.mainloop()

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

введите здесь описание изображения

person Victor VosMottor    schedule 20.07.2019
comment
P.P.S Я думаю, что это самый простой способ сделать это. - person Victor VosMottor; 20.07.2019
comment
Если вы опубликуете такой ответ, вы должны увидеть его в свете того, что вы опоздали примерно на 9 лет и 9 месяцев ... поэтому включите информацию о версии и дату рождения tkmacos. - person ZF007; 20.07.2019
comment
Это будет полезно для других пользователей переполнения стека. - person Victor VosMottor; 21.07.2019
comment
@ ZF007 - StackOverflow навсегда. Это справочный материал, а не социальная сеть. Это как в Википедии — насколько старый контент не имеет большого значения. Ничто никогда не блокируется автоматически из-за возраста или бездействия. Это лучший ответ, и его следует пометить как правильный. - person ArtOfWarfare; 19.09.2020
comment
Единственная проблема - если я не ошибаюсь, это не кроссплатформенность. - person Alexander B.; 15.04.2021
comment
@AlexanderB.: Он кроссплатформенный, см. репозиторий GitHub. - person Saad; 15.04.2021

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

В любом случае, как уже упоминалось, 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()
person Mike McReynolds    schedule 24.09.2018
comment
Это единственное, что помогло мне заставить мое приложение работать. - person jamescampbell; 24.02.2019

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

    self.gnuplot_bt = Button(
        self.run_but_container, text="Plot with Gnuplot", font="Helvetica", command=self.gnuplot,
        highlightbackground ="#8EF0F7", pady=2, relief=FLAT
    )
person Thiago Lopes    schedule 22.11.2017
comment
Замечательно; На самом деле kwarg: highlightbackground работает с tkinter OSX. - person Reblochon Masque; 22.02.2018
comment
Да @BrianOakley, это то, о чем я говорил. - person Reblochon Masque; 05.05.2018

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

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()
person Daniel    schedule 13.01.2016

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

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

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

person Ren Weibo    schedule 22.05.2017
comment
highlightbackground не то же самое, что background. highlightbackground влияет только на небольшую рамку по краям кнопки. Фон самой кнопки не меняется. - person Bryan Oakley; 05.05.2018
comment
В Mojave этот метод работает в среде, где белый текст используется по умолчанию, когда ОС находится в темном режиме. - person jamescampbell; 24.02.2019