Как считать что написано в entry
Я пытаюсь сделать чтоб когда человек ввыводил число и нажимал на кнопку сроботавало if и ответ ввыводилось на экран. Ещё хотел чтоб нельзя было писать число больше 100 и буквы но это не обсуждается. Вот полный код:
from tkinter import *
from random import randint
def func(key):
variant.insert(END, key)
def remove():
variant.delete(0,END)
if variant == number:
l2 = Label(text="Поздравляю! Вы выграли!",
font="Arial 12",
bg="black",
fg="white")
l2.place(x=10, y=40, width=171, height=21)
elif variant > number:
l2 = Label(text="Это число меньше этого число.",
font="Arial 12",
bg="black",
fg="white")
l2.place(x=10, y=40, width=171, height=21)
elif variant < number:
l2 = Label(text="Это число больше этого число.",
font="Arial 12",
bg="black",
fg="white")
l2.place(x=10, y=40, width=171, height=21)
root = Tk()
root.geometry('192x393+500+150')
root.title("Угадай число!")
root["bg"] = "black"
loadimage = PhotoImage(file="galca.png")
number = 5
l1 = Label(text="Это число от 1 до 100",
font="Arial 12",
bg="black",
fg="white")
l1.place(x=10, y=10, width=171, height=21)
variant = Entry(root, bg="black",
fg="white",
font="Arial, 30",
justify="center")
variant.place(x=10, y=80, width=171, height=61)
b1 = Button(text="1", command = lambda x='1': func(x))
b1["bg"] = "gray27"
b1["border"] = "0"
b1["activebackground"] = "gray19"
b1.place(x=10, y=270, width=51, height=51)
b2 = Button(text="2", command = lambda x='2': func(x))
b2["bg"] = "gray27"
b2["border"] = "0"
b2["activebackground"] = "gray19"
b2.place(x=70, y=270, width=51, height=51)
b3 = Button(text="3", command = lambda x='3': func(x))
b3["bg"] = "gray27"
b3["border"] = "0"
b3["activebackground"] = "gray19"
b3.place(x=130, y=270, width=51, height=51)
b4 = Button(text="4", command = lambda x='4': func(x))
b4["bg"] = "gray27"
b4["border"] = "0"
b4["activebackground"] = "gray19"
b4.place(x=10, y=210, width=51, height=51)
b5 = Button(text="5", command = lambda x='5': func(x))
b5["bg"] = "gray27"
b5["border"] = "0"
b5["activebackground"] = "gray19"
b5.place(x=70, y=210, width=51, height=51)
b6 = Button(text="6", command = lambda x='6': func(x))
b6["bg"] = "gray27"
b6["border"] = "0"
b6["activebackground"] = "gray19"
b6.place(x=130, y=210, width=51, height=51)
b7 = Button(text="7", command = lambda x='7': func(x))
b7["bg"] = "gray27"
b7["border"] = "0"
b7["activebackground"] = "gray19"
b7.place(x=10, y=150, width=51, height=51)
b8 = Button(text="8", command = lambda x='8': func(x))
b8["bg"] = "gray27"
b8["border"] = "0"
b8["activebackground"] = "gray19"
b8.place(x=70, y=150, width=51, height=51)
b9 = Button(text="9", command = lambda x='9': func(x))
b9["bg"] = "gray27"
b9["border"] = "0"
b9["activebackground"] = "gray19"
b9.place(x=130, y=150, width=51, height=51)
b0 = Button(text="0", command = lambda x='0': func(x))
b0["bg"] = "gray27"
b0["border"] = "0"
b0["activebackground"] = "gray19"
b0.place(x=10, y=330, width=111, height=51)
bb = Button(image=loadimage, command = remove)
bb["border"] = "0"
bb.place(x=130, y=330, width=51, height=51)
root.mainloop()
Ответы (1 шт):
Ваша первая ошибка в том, что вы пытаетесь сравнить объект поля ввода с числом.
if variant == number: - variant не является числом, ведь так?
Правильно будет, получить значение из поля ввода с помощью variant.get(). В таком случае мы получим строковое значение, которое является текстом и его также нельзя сравнивать с числом. Поэтому его нужно сразу же преобразовать в int: ifint(variant.get())== number:
Вторая ошибка заключается в том, что вы пытаетесь сравнить значение из variant с числом, после того, как очистили variant. То есть, на момент сравнения в поле для ввода ничего нет, следовательно сравнивать нечего. Поэтому строку variant.delete(0,END) нужно переместить из начала функции remove() в конец.
Рабочая функция:
def remove():
if int(variant.get()) == number:
l2 = Label(text=f"Поздравляю!\nВы выграли! ({number})",
font="Arial 10",
bg="black",
fg="white")
l2.place(x=10, y=40, width=171, height=28)
elif int(variant.get()) > number:
l2 = Label(text="Ваше число больше\nэтого числа",
font="Arial 10",
bg="black",
fg="white")
l2.place(x=10, y=40, width=171, height=28)
elif int(variant.get()) < number:
l2 = Label(text="Ваше число меньше\nэтого числа",
font="Arial 10",
bg="black",
fg="white")
l2.place(x=10, y=40, width=171, height=28)
variant.delete(0,END)
Чтобы нельзя было вводить число больше 100, в функцию func(), вам нужно добавить всего одно условие проверки.
def func(key):
variant.insert(END, key)
if int(variant.get()) > 100:
variant.delete(0,END)
variant.insert(END, 100)
Сначала мы получаем цифру, а после сравниваем получившееся число с 100. Если число больше, то оно автоматически заменится на 100.
Что касается запрета на ввод букв, здесь немного сложнее, так как нужно создавать еще одну функцию, для проверки ввода с клавиатуры, а не кнопок с цифрами.
Делается это так:
В коде, после объявления поля ввода variant, нужно назначить ему прослушивание нажатых клавиш при вводе.
То есть, после строки размещения поля ввода variant.place() нужно добавить строку
variant.bind("<Any-KeyRelease>", control_type), а затем выше, рядом с остальными функциями разместить и функцию проверки control_type()
def control_type(event):
data = variant.get()
if not data.isdigit() and data != '':
variant["bg"] = "red"
result = ''
for i in variant.get():
if i.isdigit():
result += i
variant.delete(0, END)
variant.insert(0, result)
l2 = Label(text="Введите число!",
font="Arial 10",
bg="black",
fg="white")
l2.place(x=10, y=40, width=171, height=28)
else:
variant["bg"] = "black"
if int(variant.get()) > 100:
variant.delete(0,END)
variant.insert(END, 100)