Как сделать так, чтобы при вводе в 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
→ Ссылка
Ну, тут несколько проблем:
- Функция
validу вас никогда не вызывается - Цикл
whileникогда не завершится, и до проверки код никогда не дойдет. Если нужно, чтобы проверка выполнялась периодически, то по логике проверка должна быть внутри цикла, а не после него. entry.get() == aсравнивает строку из текстового поля с числом. Это условие никогда не будет истинным, т.к. никакая строка не равна никакому числу. Нужно илиentry.get()привести к целому числу, илиaк строке, потом уже сравнивать.- В приложениях 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())