Как мне удалить ttk для Python3 tkinter.CheckButton пунктирную линию, которая появляется после установки флажка?

#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