Как правильно использовать окно сообщения об ошибке tkinter, чтобы дождаться, пока пользовательский ввод не будет соответствовать требованиям? - PullRequest
2 голосов
/ 19 июня 2020

Я пытаюсь использовать окна сообщений 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() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...