Отключение виджета масштаба tkinter ttk

Я пытаюсь отключить все виджеты (ttk) в кадре, но кажется, что виджет масштаба доставляет мне некоторые проблемы, поскольку он выдает следующее исключение:

_tkinter.TclError: неизвестная опция "-state"

Некоторый соответствующий код:

import tkinter as tk
from tkinter import ttk

def disable_widgets(parent):
    for child in parent.winfo_children():
        child.config(state = 'disabled')

root = tk.Tk()

# Frame full of widgets to toggle
frame_of_widgets = ttk.Frame(root)
frame_of_widgets.pack()

# Button to be disabled
button_to_disable = ttk.Button(frame_of_widgets)
button_to_disable.pack()

# Entry to be disabled
entry_to_disable = ttk.Entry(frame_of_widgets)
entry_to_disable.pack()

# Scale to be disabled
scale_to_disable = ttk.Scale(frame_of_widgets)
scale_to_disable.pack()

# Button that disables widgets in frame
disable_button = ttk.Button(root,text="Disable",command= lambda: disable_widgets(frame_of_widgets))
disable_button.pack()

root.mainloop()

Работает на кнопку и вход, но не на шкалу. Я думал, что одним из преимуществ ttk было сделать виджеты более унифицированными с помощью общих методов и атрибутов, поэтому я предполагаю, что, возможно, я неправильно обращаюсь ко всем трем этим виджетам?


person Msg    schedule 09.06.2015    source источник


Ответы (2)


Для виджетов ttk вы используете метод state. Метод state для кнопок и виджетов ввода — это просто удобная функция для имитации стандартных кнопок и виджетов ввода.

Вы можете переписать свою функцию следующим образом:

def disable_widgets(parent):
    for child in parent.winfo_children():
        child.state(["disabled"])

состояния ttk упоминаются в документации по ttk здесь (хотя описание граничит с бесполезностью): https://docs.python.org/3.1/library/tkinter.ttk.html#widget-states

person Bryan Oakley    schedule 09.06.2015
comment
Это именно то, что мне было нужно, спасибо! Раньше я пробовал child.state('disabled'), который также работал для кнопки и входа, но не для шкалы. Оказывается, составление списка помогло. Также интересно, что кажется, что «нормальный» и «включенный» тоже не работают, так как мне нужно использовать «! отключенный». Еще раз спасибо! - person Msg; 09.06.2015

другой путь:

scale_to_disable.configure(state='disabled')  # 'normal'

Вы можете подумать, что установка точки останова на configure класса Scale (from tkinter.ttk import Scale) может оказаться полезной.

Ниже приведена часть кода для перехвата class Scale

class Scale(Widget, tkinter.Scale):

    ...

    def configure(self, cnf=None, **kw):
        if cnf:
            kw.update(cnf)
        Widget.configure(self, **kw)
person Carson    schedule 21.01.2020
comment
Пожалуйста, не размещайте изображения кода. Когда оно публикуется как изображение, оно недоступно для поиска, и люди не могут его скопировать. - person Bryan Oakley; 10.02.2020
comment
Я заявил, что этот код находится в родной библиотеке Python. (Python37\Lib\tkinter\ttk.py -> class Scale ...) Причина не писать код прямо на картинке заключается в том, что я думаю, что важно найти ответ в нативном коде, поэтому я только предоставляю местоположение источника, я надеюсь, что пользователи могут пойти и посмотреть сами И даже если я напишу код картинки, это бесполезно, потому что я не могу написать весь зависимый код, а читать длинную историю мало кто готов, Поэтому я призываю пользователя смотреть на нативный код и надеяться ты понимаешь. - person Carson; 11.02.2020
comment
У изображений плохой юзабилити — они не доступны для поиска, а люди с ослабленным зрением вообще не смогут получить никакой информации. - person Bryan Oakley; 11.02.2020
comment
Спасибо за ваши предложения, я улучшил свой ответ, я понял, что картинку все еще можно выразить словами. - person Carson; 11.02.2020