ttk.Widget.state() TclError: недопустимое имя состояния

#python #tkinter #tk #ttk

#python #tkinter #tk-toolkit #ttk

Вопрос:

Я пытаюсь изменить состояние ttk.button (в начале mainloop) в tkinter, как в этом руководстве [актуализация: на самом деле здесь .]

 import tkinter
from tkinter import ttk

root = tkinter.Tk()

style = ttk.Style()
style.map("C.TButton",
    foreground=[('pressed', 'red'), ('active', 'blue')],
    background=[('pressed', '!disabled', 'black'), ('active', 'white')]
    )

colored_btn = ttk.Button(text="Test", style="C.TButton")
colored_btn.pack()

colored_btn.state('pressed')

root.mainloop()
  

Результат ошибки:

 in state return self.tk.splitlist(str(self.tk.call(self._w, "state", statespec))) _tkinter.TclError: Invalid state name p
  

Комментарии:

1. Ссылка в вашем вопросе не работает.

2. Я обновил его.

Ответ №1:

 colored_btn.state(('pressed',))
  

Из документации Python:

спецификация состояния обычно представляет собой список или кортеж.

Я полагаю, что эта проблема возникает из-за разницы в версиях 8.6 и 8.5 tkinter.

Обратите внимание, что в руководстве, связанном с вопросом (tkinter 8.5), есть stateSpac аргумент, а в tkinter 8.6 — statespec . Такие вещи всегда должны предупреждать вас о том, что в версиях могут быть изменения.

Комментарии:

1. На мой взгляд, «обычно» — это глупое утверждение для ссылки вручную

2. Фактически подойдет любая итерация.