Я пытаюсь использовать окна сообщений tkinter таким образом, чтобы, если пользователь вводит недопустимую запись, появлялось окно сообщения об ошибке, и после выбора «хорошо» у них была возможность предоставить новую запись. Однако никакие последующие вычисления не должны производиться, пока запись не станет действительной.
В этом простом примере пользователя просят ввести положительное число, которое затем удваивается. В первую часть скрипта я включил код, чтобы пользователь не мог вводить буквы или специальные символы. Затем я использую if-then, чтобы удвоить свой номер, если он положительный, и создать окно сообщения об ошибке, если это не так. Конечно, здесь пока нет ничего, что приостанавливает вычисление до тех пор, пока ввод не станет действительным. Вот где я борюсь.
from tkinter import Tk, Label, Entry, Button, messagebox
import re
def validate(string):
regex = re.compile(r"(\+|\-)?[0-9.]*$")
result = regex.match(string)
return (string == ""
or (string.count('+') <= 1
and string.count('-') <= 1
and string.count('.')<=1
and result is not None
and result.group(0) != ""))
def on_validate(P):
return validate(P)
window = Tk()
window.title("My Window")
window.geometry('800x800')
window.configure(bg='lightgrey')
input_label=Label(window,bg='lightgray',text="Enter positive number:")
input_label.grid(row=0, column=0,padx=10, pady=10)
# Get input and test for valid characters
entry = Entry(window, validate="key",width=20)
vcmd = (entry.register(on_validate), '%P')
entry.config(validatecommand=vcmd)
entry.grid(row=0,column=1,padx=10,pady=10)
output_label=Label(window,width=20)
output_label.grid(row=1, column=0,padx=10, pady=10)
def _compute():
input=float(entry.get())
if input<=0:
messagebox.showerror("Error","Input must be positive!")
# What can I do here to suspend the process until my input is valid?
else:
input=float(entry.get())
output_label.configure(text=str(2*input))
compute_button = Button(master=window, text="Compute",bg='lightgray',command=_compute)
compute_button.grid(row=2, column=0,padx=10, pady=10)
def _quit():
window.quit()
window.destroy()
quit_button = Button(master=window, text="Quit", bg='lightgray',command=_quit)
quit_button.grid(row=2, column=1,padx=10, pady=10)
window.mainloop()