Как изменить основной или фоновый цвет кнопки Tkinter в Mac OS X? - PullRequest
20 голосов
/ 07 октября 2009

Я работал над главами 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 изменяются цвета метки и кнопки.

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

Я проверил Интерфейсный Разработчик, и кажется, что нет никакой возможности изменить цвет переднего плана или фона кнопки в этом инструменте. Есть возможность редактировать основной и фоновый цвета надписи.

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

Ответы [ 7 ]

20 голосов
/ 07 октября 2009

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

14 голосов
/ 04 марта 2017

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

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

highlightbackground=color

Например:

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

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

button

13 голосов
/ 03 марта 2012

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

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

В любом случае, как уже упоминали другие, 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()
1 голос
/ 22 ноября 2017

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

    self.gnuplot_bt = Button(
        self.run_but_container, text="Plot with Gnuplot", font="Helvetica", command=self.gnuplot,
        highlightbackground ="#8EF0F7", pady=2, relief=FLAT
    )
1 голос
/ 13 января 2016

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

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()
0 голосов
/ 22 мая 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...