Как сделать так, чтобы при вводе в entry строку, была проверка entry.get() == a и окно закрывалось?

Вот код:

from tkinter import *
from tkinter import Tk, Entry, Label
from tkinter import ttk
import os, pyautogui, sys
import random
from random import randint

#окошко
root = Tk()
root.title("root")
root.resizable(width=False, height=False)
root.geometry('500x350')
#Текст
lbl = Label(root, text="Привет!")
lbl.place(relx=.5, rely=.1, anchor="center")
lbl = Label(root, text="Чтобы воспользоваться: ")
lbl.place(relx=.5, rely=.2, anchor="center")
lbl = Label(root, text="1) Нажми кнопку левом нижнем углу окна, она выдаст тебе код")
lbl.place(relx=.5, rely=.3, anchor="center")
lbl = Label(root, text="2) введи его в поле ввода ниже!")
lbl.place(relx=.5, rely=.4, anchor="center")
#рандомный код
def code():
    global a
    a = random.randint(100000, 999999)
    print (a)

def check():
    print (a)
#кнопочки

b1 = Button(text="Код", width=8, height=2)
b1.config(command=code)
b1.pack(anchor=NW, padx=6, pady=6)
b1.place(relx=.1, rely=.8, anchor=NW)

b2 = Button(text="Вебсайт", 

            width=10, height=2)
b2.config(command=check)
b2.pack()
b2.place(relx=.5, rely=.8, anchor="center")

b3 = Button(text="Инструкция", width=15, height=2)
b3.config()
b3.pack()
b3.place(relx=.7, rely=.8, anchor=NW)

#поле ввода
entry = Entry(root, font='Courier 12')
entry.place(relx=.5, rely=.6, anchor="center", width=100, height=20)
entry.focus()

#проверка кода
def valid():
    while True:
        root.update()
    
    if entry.get() ==a:
        sys.exit()
       


root.mainloop()

Он работает, но при вводе рандомного кода (генерируется кнопкой Код), ничего не происходит, а должно закрываться окно

Заранее благодарю ответы-советы)


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

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

Ну, тут несколько проблем:

  1. Функция valid у вас никогда не вызывается
  2. Цикл while никогда не завершится, и до проверки код никогда не дойдет. Если нужно, чтобы проверка выполнялась периодически, то по логике проверка должна быть внутри цикла, а не после него.
  3. entry.get() == a сравнивает строку из текстового поля с числом. Это условие никогда не будет истинным, т.к. никакая строка не равна никакому числу. Нужно или entry.get() привести к целому числу, или a к строке, потом уже сравнивать.
  4. В приложениях tkinter вместо цикла while с update лучше использовать планирование выполнения функции через root.after.

Исправления такие:

...

def code():
    global a
    a = random.randint(100000, 999999)
    print (a)
    valid()  # Запускаем функцию проверки после генерации числа

...


#проверка кода
def valid():
    if entry.get() == str(a):
        sys.exit()

    root.after(100, valid)  # Запланировать выполнение этой же функции через 100 мс

Также можно вообще избавиться от периодических проверок, вместо этого делать проверку только при изменении значения в текстовом поле:

entry_var = StringVar()
entry = Entry(root, font='Courier 12', textvariable=entry_var)
entry.place(relx=.5, rely=.6, anchor="center", width=100, height=20)
entry.focus()

a = None


#проверка кода
def check_variable():
    if a is not None and entry.get() == str(a):
        sys.exit()


# Отслеживаем изменение значения в entry_var
entry_var.trace("w", lambda name, index, mode: check_variable())
→ Ссылка