【问题标题】:How to validate entry in tkinter?如何验证 tkinter 中的条目?
【发布时间】:2018-04-17 17:48:01
【问题描述】:

我已经找到了这个问题的一些答案,但没有一个答案对我的程序有效。 我正在尝试验证代码中的名称变量,但isalpha() 不是tkinter 中使用的函数。

到目前为止,这是我的代码:

class newUser:
    root.title("Sign Up")
    header = Label(root, text = "Sign Up!\n")
    header.grid(row = 0, column = 0, sticky = E)

    global results
    results = False

    def getName(): #Getting name of the user
        global name

        nameX = Label(root, text = "Please enter your name: ")
        nameX.grid(row = 1, column = 0, sticky = W)

        name = Entry(root)
        name.grid(row =1, column = 1)
        #name = name.get()

        if name.isalpha() and name != "":
            name = name
            #newUser.getAge()
        else:
            print("Please ensure you have entered your name. Thank you. ")
            newUser.getName()
        root.mainloop()


newUser.getName()

我尝试使用name.get(),但它创建了一个无限循环。 有什么想法吗?

【问题讨论】:

  • newUser 类的代码缩进搞砸了。即使你修复了它,你也需要在调用它的任何方法之前创建类的实例(如果getName()应该是这样的话)。

标签: python function validation user-interface tkinter


【解决方案1】:

isalpha()str 对象的内置函数。在被定义为tkinter.Entry 对象的name 上调用isalpha() 将引发异常,因为tkinter.Entry 没有这样的功能。虽然您尝试使用 get() 函数是正确的,该函数是 tkinter.Entry 对象的函数,并且确实返回支持 isalpha() 调用的 str,但您的实现有点偏离。

您正在进入递归,因为name.get() 立即返回一个字符串,该字符串未能满足name != "" 检查的条件,导致Python 解释器陷入调用newUser.getName() 的包罗万象的else 子句,该函数我们已经在里面了,这个过程会一直重复,直到超过 Python 的最大递归深度。您不想在tkinter.Entry 对象上立即 调用get(),因为这使用户没有时间输入任何内容。相反,get() 应该在某些事件发生后调用,例如按下提交按钮。

请尝试以下方法:

import tkinter as tk

root = tk.Tk()

class NewUser:

    def __init__(self):

        self.name = None

        root.title("Sign Up")

        self.headerLabel  = tk.Label (root, text = "Sign Up!\n")
        self.nameLabel    = tk.Label (root, text = "Please enter your name: ")
        self.nameField    = tk.Entry (root)
        self.submitButton = tk.Button(root, text = "Submit", command = self.saveName)

        self.headerLabel.grid (row = 0, column = 0, columnspan = 2)
        self.nameLabel.grid   (row = 1, column = 0, sticky = "W")
        self.nameField.grid   (row = 1, column = 1)
        self.submitButton.grid(row = 2, column = 0, columnspan = 2, sticky = "EW")

    def saveName(self):

        name = self.nameField.get()

        if name.isalpha() and name != "":

            self.name = name
            print("Name saved: {}".format(self.name))

        else:

            print("Please ensure you have entered your name. Thank you.")

user = NewUser()

root.mainloop()

此代码将生成以下窗口:

此时,如果您点击Submit 按钮,name 将是一个空字符串并且将无法通过name != "" 比较。因此,以下内容将打印到控制台:

Please ensure you have entered your name. Thank you.

但是,如果您输入您的姓名,假设您只包含如下字母字符:

按下Submit后,控制台会打印以下内容:

Name saved: Erick

现在可以通过NewUser 类的self.name 成员变量访问保存的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多