Python 如何避免 AttributeError: '_tkinter.tkapp' 对象没有属性 'PassCheck'
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/38229857/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to avoid AttributeError: '_tkinter.tkapp' object has no attribute 'PassCheck'
提问by DrDevilHell
I have read previous posts regarding this error but could not identify what i was doing wrong.Please can someone help me understand what i am doing wrong,thank you.
我已阅读有关此错误的先前帖子,但无法确定我做错了什么。请有人帮助我了解我做错了什么,谢谢。
from tkinter import *
class Passwordchecker():
def __init__(self):
self= Tk()
self.geometry("200x200")
self.title("Password checker")
self.entry=Entry(self)
self.entry.pack()
self.button=Button(self,text="Enter",command= lambda: self.PassCheck(self.entry,self.label))
self.button.pack()
self.label=Label(self,text="Please a password")
self.label.pack()
self.mainloop()
def PassCheck(self1,self2):
password = self1.get()
if len(password)>=9 and len(password)<=12:
self2.config(text="Password is correct")
else:
self2.config(text="Password is incorrect")
run = Passwordchecker()
回答by Billal Begueradj
What triggered the error?
是什么触发了错误?
You get this error message:
您收到此错误消息:
AttributeError: '_tkinter.tkapp' object has no attribute 'PassCheck'
Because when an instance of Passwordchecker()
is initialized, it stumbles on the mainloop()
method of your __init__()
which does not let your program to recognize any further method belonging to that instance. As a rule of thumb, NEVERrun mainloop()
inside __init__()
. This fixes fully the error message you got above. However, we have other things to fix, and for that, let us redesign your program:
因为当Passwordchecker()
初始化的实例时,它会偶然mainloop()
发现您的方法,该方法__init__()
不允许您的程序识别属于该实例的任何其他方法。作为一个经验法则,从来没有运行mainloop()
里面__init__()
。这完全修复了您在上面收到的错误消息。但是,我们还有其他事情需要解决,为此,让我们重新设计您的程序:
Design
设计
It is better to resort to an other method you call inside __init__()
to draw your GUI. Let us call it initialize_user_interface()
.
最好使用您在内部调用的其他方法__init__()
来绘制 GUI。让我们称之为initialize_user_interface()
。
When it comes to PassCheck()
, you need first to past the object itself to this method. This means the first argument to pass to this method is self
. And that is the only argument we need in fact PassCheck(self)
because you can access from this method the remaining argument you passed uselessly to it.
说到PassCheck()
,您首先需要将对象本身传递给此方法。这意味着传递给此方法的第一个参数是self
. 事实上,这是我们唯一需要的参数,PassCheck(self)
因为您可以从此方法访问您无用地传递给它的剩余参数。
Program
程序
So here is the full program you need:
所以这是您需要的完整程序:
import tkinter as tk
class Passwordchecker(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.initialize_user_interface()
def initialize_user_interface(self):
self.parent.geometry("200x200")
self.parent.title("Password checker")
self.entry=tk.Entry(self.parent)
self.entry.pack()
self.button=tk.Button(self.parent,text="Enter", command=self.PassCheck)
self.button.pack()
self.label=tk.Label(self.parent,text="Please a password")
self.label.pack()
def PassCheck(self):
password = self.entry.get()
if len(password)>=9 and len(password)<=12:
self.label.config(text="Password is correct")
else:
self.label.config(text="Password is incorrect")
if __name__ == '__main__':
root = tk.Tk()
run = Passwordchecker(root)
root.mainloop()
Demo
演示
Here is a screenshot of the running program:
下面是运行程序的截图: