如何验证tkinter中的条目?

时间:2017-11-05 13:30:09

标签: python function validation user-interface tkinter

我已经找到了这个问题的一些答案,但没有一个答案对我的程序起作用。 我正在尝试在我的代码中验证名称变量,但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(),但它创建了无限循环。 有什么想法吗?

1 个答案:

答案 0 :(得分:3)

isalpha()str个对象的内置函数。在isalpha()上调用name,其被定义为tkinter.Entry对象将引发异常,因为tkinter.Entry没有此类函数。虽然您在尝试使用get()函数时是正确的,tkinter.Entry函数是str个对象的函数,并返回支持isalpha()调用的name.get(),但您的实现有点关闭。

您正在进入递归,因为name != ""会立即返回一个字符串,该字符串未通过else检查的条件,导致Python解释器落入调用的全部newUser.getName()子句中get(),我们已经使用的函数,并且重复该过程,直到超过Python的最大递归深度。您不希望立即在tkinter.Entry对象上调用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

此代码将生成以下窗口:

tkinter window without entry text

此时,如果您点击name按钮,name != ""将是一个空字符串,并且Please ensure you have entered your name. Thank you. 比较失败。因此,以下内容将打印到控制台:

Submit

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

tkinter window with entry text

Name saved: Erick

后,以下内容将打印到控制台
self.name

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