Проверка, отключен ли виджет Tkinter (OptionMenu) - PullRequest
0 голосов
/ 08 июня 2018

Мне кажется, что я искал в сети целую вечность, перефразировал мой вопрос тысячу раз для чего-то, что, как мне кажется, должно быть очень простым.

Интересно, есть ли способ проверить, есть ли Tkinter?Виджет активен (не выделен серым цветом / отключен).У меня есть набор OptionMenus, которые вначале отключены и настроены на state=ACTIVE при установке флажка, чтобы пользователь мог выбрать, какие OptionMenus они хотят использовать.

Когда я пытаюсь «отправить»поля в OptionMenus, я хочу только те, которые ACTIVE.Я уже пробовал if OptionMenu.state == ACTIVE, но затем я получаю сообщение об ошибке, что у OptionMenu нет состояния атрибута, хотя я настраиваю его ранее.

Вот пример моего кода:

from tkinter import *    

class Application(Frame):
    # Initializing the window and the required variables
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.checkbox_in_use = BooleanVar(self, False)
        self.checkbox = Checkbutton(self, text="check", 
                                    var=self.checkbox_in_use, 
                                    command=self.check_change
        self.checkbox.grid(row=0, column=1, sticky='W')

        self.menu = OptionMenu(title_setting,
                               "Menu",
                               "Menu",
                               ["Menu1", "Menu2"])
        self.menu.grid(row=1, column=1)
        self.menu.config(state=DISABLED)

        submit = Button(self, text="submit", 
                        command=self.submit_function)
        submit.grid(row=2, column=0)

        self.master = master
        self.init_window()

    # Initialize the window
    def init_window(self):
        self.master.title("Example")

        self.pack(fill=BOTH, expand=1)


    def check_change(self):
        if self.checkbox_in_use.get():
            self.menu.config(state=ACTIVE)
        else:
            self.menu.config(state=DISABLED)

    def submit_function(self):
        # This is the part I want to do something with.
        if self.menu.state == ACTIVE:
            print("You are good to go! Do the stuff.")


root = Tk()

root.geometry("400x300")

app = Application(root)

root.mainloop()

СпасибоВы за все ответы.

1 Ответ

0 голосов
/ 08 июня 2018

Все, что вам нужно, это cget() для этого.self.menu.cget('state') сделает свое дело.

Тем не менее, я хочу указать на некоторые другие вещи в вашем коде.

У вас Application класса уже есть __init__ в начале, так почемуuse:

# Initialize the window
def init_window(self):
    self.master.title("Example")
    self.pack(fill=BOTH, expand=1)

Вы действительно должны упаковать кадр не внутри класса frame, а при вызове класса.Также пакет не будет работать здесь, он выдаст ошибку.Сделайте это вместо: app = Application(root).grid().

Посмотрите на переформатированный пример ниже (с cget()).

from tkinter import *    

class Application(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master.title("Example")
        self.checkbox_in_use = BooleanVar(self, False)
        self.checkbox = Checkbutton(self, text="check", var=self.checkbox_in_use, command=self.check_change)
        self.checkbox.grid(row=0, column=1, sticky='W')

        self.menu = OptionMenu(master,"Menu","Menu",["Menu1", "Menu2"])
        self.menu.grid(row=1, column=1)
        self.menu.config(state=DISABLED)

        Button(self, text="submit", command=self.submit_function).grid(row=2, column=0)

    def check_change(self):
        if self.checkbox_in_use.get():
            self.menu.config(state=ACTIVE)
        else:
            self.menu.config(state=DISABLED)

    def submit_function(self):
        print(self.menu.cget('state'))


root = Tk()
root.geometry("400x300")
app = Application(root).grid()
root.mainloop()
...