【问题标题】:How to validate a Tkinter entry widget to only accept string?如何验证 Tkinter 条目小部件仅接受字符串?
【发布时间】:2020-08-09 00:04:33
【问题描述】:

我正在尝试通过 Tkinter 工作,这是我的代码的一部分:

 FirstName = Label(canvas, text="First Name")
 FirstName.configure(width=30, bg="white", fg="black", border=10)
 FirstName = canvas.create_window(330, 130, anchor = CENTER, window=FirstName)

 FName_Entry = Entry(canvas)
 canvas.create_window(850, 145, window=FName_Entry, height=35, width=300)

如您所见,这是一个供用户输入名字的条目小部件。 我如何验证它是否只接受字符串(字母),如果他们尝试输入整数、符号或基本上不是字母的任何内容,它应该在小部件的一侧显示一条消息,敦促用户输入有效的名称。

我尝试在线查看,但他们中的大多数人都在使用课程,我还不习惯课程,并且是 Tkinter 的新手。其他示例解释了如何将条目限制为整数,所以我在这里有点困惑。 感谢您的帮助!

【问题讨论】:

  • 在该小部件中输入的任何内容都是字符串。听起来您想验证字符串包含的字符。但要小心假设哪些字符是有效的:一些名称包含空格,hyphens, accents... 现在还有could be other characters too
  • @Chris,请记住这一点!但是,数字呢?如果有人尝试输入数字,我如何在它旁边显示一条消息?
  • 一般来说,我会假设一个人输入的任何东西都是有效的。世界上有很多名字,其中很多都不符合你对什么是有效名字的想法。 Elon Musk 给他的孩子取名为“X Æ A-12”,有一个child named Seven (or was it "7") in Seinfeld many years ago,当然还有Eleven ("11"?) in Stranger Things。验证实际上有验证规则的东西:电话号码(规范化它们)、电子邮件地址(虽然我建议只需要一个@),...
  • 我有一个朋友的姓是两个字符,他经常有软件表格告诉他他的名字无效。猜猜什么是无效的?表格上的规则,而不是名称。

标签: python python-3.x validation tkinter widget


【解决方案1】:

这是一个小sn-p,实际上可以让您更好地理解

from tkinter import * 
from tkinter import messagebox

root = Tk()

def check():
    sel = e.get()
    
    if not sel.isalpha():
        messagebox.showerror('Only letters','Only letters are allowed!')

e = Entry(root)
e.pack(pady=10)

b = Button(root,text='Click Me',command=check)
b.pack(padx=10,pady=10)

root.mainloop()

这里我们检查sel.isalpha() 是否返回False,如果返回,则显示messagebox,表示只允许使用字母。就这么简单。

如果有任何错误,请告诉我。快乐编码

Here 更多关于isalpha() 方法

干杯

【讨论】:

  • "abc123".isdigit() 返回 False,因此不会显示错误,这不是 OP 想要的。可以改用isalpha()
  • 会添加“它应该在小部件的侧面显示一条消息,敦促用户输入有效名称”,但您的解决方案适合。
  • 是的,当然,这里只是一个 sn-p,希望 OP 会做到这一点
  • 嗨,我试过你说的,但我有一个小问题,你能帮我stackoverflow.com/q/63330189/14054851
【解决方案2】:

您可以使用列表来存储要接受的信件。 然后用列表中的元素检查输入的每个字母。 如果从列表中的输入中没有找到任何字符(可接受的字符),则它是无效输入。

# acceptable character list
accepted_characters = ['a', 'b', 'c',.....'z', 'A', 'B', 'C',...'Z']

# input from the tkinter entry widget
inp = "hello"

for i in inp:
    if i not in accepted_characters:
        print('Invalid data.')

另一种方法是使用 RegEx 模块,它是内置模块。但是我对 RegEx 不太熟悉。

【讨论】:

  • 实际上,如果您反过来想,制作一个数字列表很容易,对吧?因为只存在 10 个数字(包括 0),以及 if 和 elif,基于此:D
  • 如果要接受字符串,则有效字符为 (a-z, A-Z)。但是如果你只用数字验证你的字符串,即你可以接受任何字母但不能接受整数,那么你可以创建一个整数列表。我展示的给定示例将只接受 (a-z, A-Z)。如果您不想只接受整数,则可以使用.isdigit().isalpha()。如果您想验证名称,那么我认为给定的示例是最好的。
  • 在某种程度上,是的!但我的意思是,在这两种情况下创建一个包含所有字母的列表很麻烦
  • 创建一个模块并在主程序中导入。该模块将包含用于任何目的的所有验证数据。这将使您的代码保持干净。
  • 是的,我也在考虑放一个 break 语句。谢谢。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
相关资源
最近更新 更多