Python Tkinter含引号用户输入的in运算符校验问题求解
问题根源与解决办法
你的核心问题是判断逻辑完全搞反了:原代码是检查整个输入字符串是否是单个ASCII标点/数字,而不是检查输入字符串中是否包含任意一个这类字符。不管输入带不带引号,只要输入长度大于1,或者不是单个标点/数字,原代码都会返回False,只是你刚好在带引号的输入时发现了问题。
正确的实现方式
我们需要遍历输入字符串的每一个字符,检查是否存在属于string.digits或string.punctuation的字符,用any()函数可以高效完成这个判断:
基础验证示例
import string a = '1"#' # 合并禁止的字符集合 forbidden_chars = string.digits + string.punctuation # 检查输入中是否存在任何禁止字符 if any(char in forbidden_chars for char in a): raise ValueError("incorrect") else: # 处理合法输入 pass
Tkinter实际场景示例
import string import tkinter as tk root = tk.Tk() input_var = tk.StringVar(value='1"#') forbidden_chars = string.digits + string.punctuation if any(char in forbidden_chars for char in input_var.get()): raise ValueError("incorrect") else: # 处理合法输入 pass
为什么之前的方法没用?
你之前尝试用replace()去掉引号,但本质逻辑还是错的:即使去掉引号,剩下的'1#'依然是一个长度为2的字符串,不可能出现在string.digits.join(string.punctuation)生成的单个字符组成的字符串里,所以判断结果还是False。
内容的提问来源于stack exchange,提问作者Marcell
相关产品推荐
相关产品推荐

