You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:54:52