Tkinter GUI问题:如何仅在输入验证通过时关闭窗口
问题解决:仅在Tkinter输入验证通过后关闭窗口
你的问题核心是window.destroy()的位置不合理——当前它在输入验证逻辑后直接执行,不管验证是否失败。要实现仅当两个输入都是有效正数值时才关闭窗口,可以通过添加验证标志来控制销毁窗口的时机,具体修改如下:
修改后的核心逻辑
在验证函数中添加一个valid标志,初始设为True,只要任意输入验证失败(非数值、小于等于0),就将标志设为False,最后仅当标志为True时才调用window.destroy()。
修改后的完整代码
import tkinter from tkinter import * from tkinter import messagebox def enter_data_close(): global user_input_1 global user_input_2 user_input_1 = user_input_1_entry.get() user_input_2 = user_input_2_entry.get() valid = True # 初始化验证通过标志 if user_input_1 and user_input_2: try: user_input_1 = float(user_input_1) if user_input_1 <= 0: tkinter.messagebox.showwarning(title="Value Error!", message="user_input_1 must be a positive number(>0). Please provide a different value!") valid = False # 验证失败,标记为False except ValueError: tkinter.messagebox.showwarning(title="Value Error!", message="Please provide a numeric value for user_input_1!") valid = False # 验证失败,标记为False try: user_input_2 = float(user_input_2) if user_input_2 <= 0: tkinter.messagebox.showwarning(title="Value Error!", message="user_input_2 must be a positive number(>0). Please provide a different value!") valid = False # 验证失败,标记为False except ValueError: tkinter.messagebox.showwarning(title="Value Error!", message="Please provide a numeric value for user_input_2!") valid = False # 验证失败,标记为False # 仅当所有验证都通过时才关闭窗口 if valid: window.destroy() else: tkinter.messagebox.showwarning(title="Error", message="Provide values for all entry boxes!") #GUI window = tkinter.Tk() window.title("Dimensions Data Entry") window.resizable(0,0) frame = tkinter.Frame(window) frame.pack() def disable_event(): pass window.protocol("WM_DELETE_WINDOW", disable_event) #DIMENSIONS dimensions_frame =tkinter.LabelFrame(frame, text="Dimensions") dimensions_frame.grid(row= 0, column=0, padx=20, pady=10) user_input_1_label = tkinter.Label(dimensions_frame, text="user_input_1:") user_input_1_label.grid(row=0, column=0) user_input_2_label = tkinter.Label(dimensions_frame, text="user_input_2:") user_input_2_label.grid(row=0, column=1) user_input_1_entry = tkinter.Entry(dimensions_frame) user_input_2_entry = tkinter.Entry(dimensions_frame) user_input_1_entry.grid(row=1, column=0) user_input_2_entry.grid(row=1, column=1) for widget in dimensions_frame.winfo_children(): widget.grid_configure(padx=10, pady=5) # ENTER DATA AND CLOSE BUTTON button = tkinter.Button(frame, text="Enter Data", command=enter_data_close) button.grid(row=3, column=0, sticky="news", padx=20, pady=10) window.mainloop()
关键改动说明
- 添加
valid = True作为验证通过的标志 - 每次验证失败(包括输入非数值、数值小于等于0)时,将
valid设为False - 将
window.destroy()移到if valid:条件块内,确保只有所有验证都通过时才执行窗口销毁操作
这样修改后,程序会在输入不合法时弹出警告并保留窗口,只有当两个输入都是有效正数值时才会关闭窗口。
内容的提问来源于stack exchange,提问作者Mechanical Engineer
相关产品推荐
相关产品推荐

