#python #tkinter #ttk
#python #tkinter #ttk
Вопрос:
Есть ли какой-либо способ удалить пунктирный контур, который появляется при нажатии на текст ttk.Объект Checkbutton при использовании темы «по умолчанию»?
пример.)
from tkinter import *
from tkinter import ttk
master = Tk()
style = ttk.Style() # print(self.style.theme_names())
style.theme_use('default')
var = IntVar()
c = ttk.Checkbutton(master, text="Click My Text", variable=var)
c.pack()
mainloop()
Если нет, есть ли какой-либо способ изменить цвет фоновой кнопки стандартной темы, используемой при запуске в Windows? (К сожалению, для этого проекта я не могу рассмотреть возможность использования каких-либо других пакетов GUI)
OS: Windows 10
Python: 3.5.1
Frustration level: one bajillion
Комментарии:
1. Пунктирный контур служит определенной цели: он позволяет пользователю узнать, какая кнопка находится в фокусе клавиатуры.
Ответ №1:
Возможно, я ошибаюсь, но, похоже, опции «вычеркнуть» не существует. Тем не менее, есть еще несколько вариантов.
Вы могли бы установить для параметра ‘takefocus’ значение False . Это остановит отображение пунктирной линии, но также удалит возможность перехода между элементами управления.
c = ttk.Checkbutton(master, text="Click My Text", variable=var, takefocus=False)
Другим вариантом было бы изменить цвет штриха, чтобы он соответствовал фону:
style.configure('TCheckbutton', focuscolor=style.configure(".")["background"])
Этот вид работает, но вам также нужно будет поиграть с цветом выделения, чтобы он всегда был невидимым.
Редактировать
Создавая небольшой пример, чтобы помочь с одним из комментариев, я нашел немного более простой способ сделать это. Используя cget(), мы можем получить значение свойства. Это можно использовать вместо изменения стиля, и его легче читать и понимать.
Используя cget, приведенный выше пример становится:
style.configure('TCheckbutton', focuscolor=master.cget("background"))
Это просто устанавливает цвет фокуса равным цвету фона основного объекта (окна).
Как и было запрошено, вот полный пример, основанный на исходном коде из вопроса:
from tkinter import *
from tkinter import ttk
master = Tk()
style = ttk.Style()
style.theme_use('default')
style.configure('TCheckbutton', focuscolor=master.cget("background"))
style.configure('TCheckbutton', activebackground=master.cget("background"))
style.configure('TCheckbutton', background=master.cget("background"))
var = IntVar()
c = ttk.Checkbutton(master, text="Click My Text", variable=var)
c.pack()
mainloop()
Здесь мы устанавливаем цвета focuscolor, activebackground и background равными цвету фона главного окна (master). Это приводит к удалению пунктирной границы.
Однако пунктирная граница существует не просто так. Она показывает пользователю, какой элемент управления находится в фокусе. Когда в окне есть только один элемент управления, это выглядит немного странно. Но когда у вас их несколько, пользователям легче перемещаться по вашему приложению с помощью клавиатуры, чем без нее.
Комментарии:
1. Привет, Эндрю, можешь ли ты каким-нибудь образом показать мне рабочую версию, потому что у меня возникли проблемы с реализацией твоего предложения. Второй фрагмент кода, который вы предоставили, похоже, изменяет цвет штриха с черного на белый, но я не уверен, как я могу заставить его соответствовать цвету фона элемента label. Также можете ли вы объяснить, к чему относится параметр «.»?
2. Мне удалось придать моему проекту желаемый стиль, однако я не совсем уверен, что понимаю, как это работает. Я попытался применить концепции к мини-примеру выше, но безуспешно. Учитывая, что я смог использовать ответ Эндрю для получения результатов, которые я искал, я отмечаю это как ответ, однако я искренне желаю, чтобы кто-нибудь предоставил более конкретный пример для тех из нас, «меня», кто будет бороться с этим в будущем. Спасибо, Эндрю, за то, что указал мне правильный путь к рабочему решению.
3. Я отредактировал сообщение, чтобы включить пример, основанный на вашем собственном коде. Я надеюсь, это поможет. @krazynhazy