我已经找到了这个问题的一些答案,但没有一个答案对我的程序起作用。
我正在尝试在我的代码中验证名称变量,但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()
,但它创建了无限循环。
有什么想法吗?
答案 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
此代码将生成以下窗口:
此时,如果您点击name
按钮,name != ""
将是一个空字符串,并且Please ensure you have entered your name. Thank you.
比较失败。因此,以下内容将打印到控制台:
Submit
但是,如果您输入您的姓名,假设您只包含如下字母字符:
按Name saved: Erick
:
self.name
现在可以通过NewUser
类的message
成员变量访问已保存的名称。