Игнорирует проверку строки и сразу выводит "NO" после нажатия кнопки

from tkinter import *
from tkinter import messagebox

root = Tk()
root.title("Клавиатурный тренажер")
root.geometry("400x300")

def rule_game():
    tea = StringVar()
    message_entry = StringVar()
    message_entry = Entry()
    tea=message_entry.get()
    slova = StringVar()
    slova = "abcd"
    if message_entry.get() == slova:
        label1 = Label(text="Result", fg="#eee", bg="#333")
        label1.pack()
    else:
        label1 = Label(text="NO", fg="#eee", bg="#333")
        label1.pack()

def start_game():
    message = StringVar()
    play_game()
    global wow_button
    wow_button = Button(text="Click Me", command=rule_game)
    wow_button.place(relx=.5, rely=.5, anchor="c")
def play_game():
    destroy_object = [btn_1]
    for object_name in destroy_object:
        object_name.destroy()
    message = StringVar()
    message_entry = Entry(textvariable=message)
    message_entry.place(relx=.5, rely=.1, anchor="c")
    poetry = "abcd"
    global label2
    label2 = Label(text=poetry, justify=LEFT)
    label2.place(relx=.3, rely=.3)


btn_1 = Button(text="start",  # текст кнопки
               background="#555",  # фоновый цвет кнопки
               foreground="#ccc",  # цвет текста
               padx="20",  # отступ от границ до содержимого по горизонтали
               pady="8",  # отступ от границ до содержимого по вертикали
               font="16",  # высота шрифта
               command=start_game
               )
btn_1.pack()
root.mainloop()

Ответы (1 шт):

Автор решения: insolor

В этом фрагменте кода:

message_entry = Entry()
tea=message_entry.get()

slova = "abcd"
if message_entry.get() == slova:
    label1 = Label(text="Result", fg="#eee", bg="#333")
    label1.pack()
else:
    label1 = Label(text="NO", fg="#eee", bg="#333")
    label1.pack()

- вы создаете новое текстовое поле, сразу пытаетесь из него что-то прочитать, но на момент создания в текстовом поле еще пусто - пользователь физически не успеет за микросекунды между выполнением этих команд что-то ввести (к тому же, данное текстовое поле вы не размещаете в окне с помощью pack/grid/place). Дальше условие в if не выполнится, потому что пустая строка, полученная из текстового поля, не равна строке "abcd", в итоге получаете NO.

По логике, вам нужно получать данные из текстового поля message_entry, созданного в функции play_game, а не создавать новое текстовое поле. Переменная message_entry, созданная в rule_game, никак не связана с переменной message_entry в play_game. Чтобы получать данные из message_entry, созданного в play_game, нужно в этой функции объявить эту переменную глобальной (или переменную message объявить глобальной, и получать данные из нее):

def rule_game():
    slova = "abcd"
    if message_entry.get() == slova:
        label1 = Label(text="Result", fg="#eee", bg="#333")
        label1.pack()
    else:
        label1 = Label(text="NO", fg="#eee", bg="#333")
        label1.pack()

...

def play_game():
    global message_entry
    ...
    message = StringVar()
    message_entry = Entry(textvariable=message)
    message_entry.place(relx=.5, rely=.1, anchor="c")

или через message:

def rule_game():
    slova = "abcd"
    if message.get() == slova:
        label1 = Label(text="Result", fg="#eee", bg="#333")
        label1.pack()
    else:
        label1 = Label(text="NO", fg="#eee", bg="#333")
        label1.pack()

...

def play_game():
    global message
    ...
    message = StringVar()
    message_entry = Entry(textvariable=message)
    message_entry.place(relx=.5, rely=.1, anchor="c")
→ Ссылка