@taiji-boy

Странное поведение поля ввода entry при проверке его состояния. Как исправить?

Здравствуйте, помогите разобраться с поведением виджета Entry.
Есть условия (Condition1, Condition2), которые выбираются в комбобоксе. В зависимости от этих условий включаются/выключаются поля ввода Entry. При проверке состояний Entry в функции validate происходят непонятные для меня явления.
В таком варианте программа работает ожидаемо, с виду все правильно:
import tkinter as tk
from tkinter import ttk


def change_condition_types(*args):
    match var.get():
        case 'Condition 1':
            entry1['state'] = 'normal'
            entry2['state'] = 'disabled'

        case 'Condition 2':
            entry1['state'] = 'disabled'
            entry2['state'] = 'normal'


def validate():
    for entry in (entry1, entry2):
        print('Состояние: ', entry['state'])

        match entry['state']:
            case 'normal':
                print('Виджет включен', entry)
            case 'disabled':
                print('Виджет отключен', entry)
            case _:
                print('Почему я попадаю сюда?', entry)


# Окно
window = tk.Tk()
window.geometry('600x500')

# Виджеты
ttk.Button(window, text='Validate!', command=validate).pack()
entry1 = ttk.Entry(window)
entry1.pack(pady=10)
entry2 = ttk.Entry(window)
entry2.pack(pady=10)

types = ['Condition 1', 'Condition 2']
var = tk.StringVar(value=types[0])
combobox = ttk.Combobox(master=window, values=types, textvariable=var, state='readonly')
combobox.pack()
var.trace('w', change_condition_types)

# Первоначальные состояния
entry2.configure(state='disabled')

window.mainloop()

Вывод после нажатия на кнопку:

Состояние: normal
Виджет включен .!entry
Состояние: disabled
Виджет отключен .!entry2

Но если в функции validate закомментировать строку c print таким образом:
def validate():
    for entry in (entry1, entry2):
        #print('Состояние: ', entry['state'])

        match entry['state']:
            case 'normal':
                print('Виджет включен', entry)
            case 'disabled':
                print('Виджет отключен', entry)
            case _:
                print('Почему я попадаю сюда?', entry)

То приложение начинает попадать в условие _, хотя статусы виджетов остаются прежними, они все так же включаются-выключаются:

Почему я попадаю сюда? .!entry
Почему я попадаю сюда? .!entry2

Из-за чего такое поведение?
  • Вопрос задан
  • 17 просмотров
Решения вопроса 1
@taiji-boy Автор вопроса
Решение найдено:
for entry in (entry1, entry2):
        # print('Состояние: ', entry['state'])
 
        match str(entry['state']):
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы